Рекурсивная выборка с бд

1. Виталий (22.07.2012 / 23:46)
Честно говоря не хочется "***кодить" и поетому прошу помощи у более опытных php программистов.
Есть таблица i_sec структура(id, name, uid)
Также есть таблица i_page(id,uid,title,name)
Вообще i_sec как-бы папки(uid=0 это главные а дальше нужно рекурсивно до потери пульса выводить папки с uid прикрепленным к пред. папке )
Также к ним выводить страницы с i_page ( uid страницы не может быть 0 соответственно прикрепляется хоть к какой то папке.
Эх буду рад если кто нибудь поймет, а если поможет то вообще день удался smile

2. Михаил (23.07.2012 / 00:18)
типа дерево сообщений вывести?

3. Виталий (23.07.2012 / 00:47)
2. дерево розделов, подрозделов, к ним всем страницы

4. iNeeXT (23.07.2012 / 01:13)
По-моему то что нужно http://www.askdev.ru/question/3553/Про-иерархический-вывод-данных/

5. Виталий (23.07.2012 / 01:30)
4. ммм ето с директориями, я слово "папка" образно использовал... у меня та же задача но с БД

6. Кевин Митник (23.07.2012 / 01:59)
в таблицах связи организованы вторичными индексами? если да, то просто рекурсивная функция выборки

7. iNeeXT (23.07.2012 / 02:40)
5. id1, дык там с базой

8. Виталий (23.07.2012 / 03:06)
6. наверное нет - поскольку я их создавал и не знаю что ето)))
7. ммм там столько кода, проще самому подумать...)

9. Петр (23.07.2012 / 10:46)
Если нужно построить дерево всех разделов, то наверняка проще будет разом извлечь все данные и разбирать с помощью php.

10. Кевин Митник (23.07.2012 / 13:02)
ресурсоемко, при большем количестве данных.

11. Виталий (23.07.2012 / 13:15)
9. какраз етот способ пришол утром))..
буду работать...

12. Петр (23.07.2012 / 13:34)
10. Кевин Митник_HHTeam, зато быстрее.

13. Виталий (23.07.2012 / 15:35)
    public function loadSections ($uid = 0, $step = 0) 
    {
        $uid = (int)abs($uid);
        
        $q = "SELECT * FROM i_sec WHERE uid='".$uid."'";

        echo str_repeat('-',$step);
        foreach ($this->db->query($q) as $sec ){
            
            $count = $this->db->query("SELECT COUNT(*) FROM i_sec WHERE uid='".$uid."'")->fetch();
            echo $sec['name'].'<br/>';
            if ($count[0]){

                $this->loadSections($sec['id'],$step+1);
                
            } else {
                $this->loadSections($sec['id'],$step-1);
            } 
            
            
        }
   
        
    }
родил что то такое - но на каком то вхождению начинает некоректо работать, м.б есть у кого желание моз потренировать?)

14. Виталий (23.07.2012 / 15:58)
все хорошо - просто не те параметры передавал в запрос
    public function loadSections ($uid = 0, $step = 0) 
    {
        $uid = (int)abs($uid);
        
        $q = "SELECT * FROM i_sec WHERE uid='".$uid."'";

        
        foreach ($this->db->query($q) as $sec ){
            $count = $this->db->query("SELECT COUNT(*) FROM i_sec WHERE uid='".$sec['id']."'")->fetch();
            
            echo str_repeat('-',$step);
            echo $sec['name'].'<br/>';
            if ($count[0]){

                $this->loadSections($sec['id'],$step+1);
                
            } else {
                $this->loadSections($sec['id'],$step-1);
            } 
            
            
        }
   
        
    } 

будут предложения по усовершенствованию кода?

Добавлено через 03:28 сек.
нужно ли кешовать если будет ~30записей?

URL: https://visavi.net/topics/33419