2013-07-25 4 views
0

У меня есть таблица с именем, как People:Mysql Выбор в вложенных циклов

id | name |parent_id 
---+------+--------- 
1 | John | 0 
2 | Jane | 1 
3 | James| 1 
4 | Jack | 0 
5 | Jim | 4 
6 | Jenny| 4 

Так ДЖОН родитель Джейн и Джеймс. Дерево идет так.

John 
-Jane 
-James 
Jack 
-Jim 
-Jenny 

Я хочу сделать таблицу, которая кажется как

<table border="1"> 
    <tr> 
     <th colspan="2">John</th> 
    </tr> 
    <tr> 
     <td>-</td><td>Jane</td> 
    </tr> 
    <tr> 
     <td>-</td><td>James</td> 
    </tr> 
    <tr> 
     <th colspan="2">Jack</th> 
    </tr> 
    <tr> 
     <td>-</td><td>Jim</td> 
    </tr> 
    <tr> 
     <td>-</td><td>Jenny</td> 
    </tr> 
<table> 

Чтобы сделать это, я использую два SQL-запросов. Вот псевдокод:

<?php 

$firstQuery = 'SELECT id, name FROM People WHERE parent_id = 0'; 

start creating the table 

while ($rowP = $result_parent->fetch()) 
{ 
    //get the child rows using the second query in the loop: 

    $secondQuery = 'SELECT id, name FROM People WHERE parent_id = $rowP["id"]'; 

    start creating table rows for child items. 

    while ($rowC = $result_child->fetch()) 
    { 
     add names into the table belonging the current parent person 
    } 
} 

?> 

Так что проблема здесь поднимается.

  1. Это очень плохой подход в плане производительности. Каков правильный путь.

  2. Когда я пытаюсь использовать идентификатор родительского лица в качестве параметра для запроса дочерних людей, я получаю сообщение об ошибке bind_param().

  3. Это может быть сделано только с одним SQL-запросом с операцией JOIN. Но я не знаю, как это сделать.

ответ

0

Я решил эту проблему:

Так основная идея о используя метод fetch() в петле while.Вместо этого, я получаю все ResultSet до петли затем использовать новый экземпляр этого в foreach цикле:

<?php 
    $firstQuery = 'SELECT id, name FROM People WHERE parent_id = 0'; 

    $resultP->setFetchMode(PDO::FETCH_ASSOC); 

    $resultP = $db->exec($firstQuery); 

    $rowP = $resultP->fetchAll(); 

    $foreach($rowP as $rp) 
    { 
     //get the child rows using the second query in the loop: 

     $secondQuery = 'SELECT id, name FROM People WHERE parent_id = :p1'; 

     //start creating table rows for child items. 

     $resultP = $db->prepare($secondQuery); 

     $resultP->bindValue(':p1', $rp["id"], PDO::PARAM_INT); 

     $resultP->setFetchMode(PDO::FETCH_ASSOC); 

     $resultP->exeecute(); 

     $rowC = $resultC->fetchAll(); 

     $foreach($rowC as $rc) 
     { 
      //add names into the table belonging the current parent person 
     } 
    } 
?> 
1

Это очень плохой подход в asppect производительности. Каков правильный путь.

на самом деле нет.
Несколько первичных поисковых запросов никогда не повредят.

Когда я пытаюсь использовать идентификатор родительского лица в качестве параметра для запроса дочерних людей, я получаю сообщение об ошибке функции bind_param().

Прежде всего, вы должны не только УПОМИНАЕТ сообщения об ошибке, но чтения и постигать его, а также обеспечить его здесь, полным и режиссерским.

Далее, для этого достаточно легко угадать. Использовать store_result()

Это может быть сделано только с одним SQL-запросом с использованием операции JOIN. Но я не знаю, как это сделать.

Канонический текст, который даже был частью MySQL официальных документов сразу: Managing Hierarchical Data in MySQL (первый результат на Google, кстати)

+0

Я знаю, что страницы, но не выяснить кое-что для моей проблемы. – zkanoca