2013-05-24 3 views
0

У меня есть две таблицы, которые соединены, а идентификатор каждой таблицы и элемента под ними аналогичны.Итерировать значения списка из таблицы

parentID | objectName | subID   ID| className| subName | 
_____________________________   ________________________ 
    84 | Test  | 14    14| BOM  | Test 
    84 | More  | 16    14| PDF  | Test 
    84 | Sub  | 15    15| Schematics | Test2 

Я хочу перечислить имя категории и идентификатор subID связанных элементов. Несколько ObjectNames будут иметь несколько связанных классов.

код PHP:

$objects = mysqli_query($con,"SELECT * from subobject"); 


$join = mysqli_query($con, "SELECT * FROM subrelation AS subrelation INNER JOIN subobject AS subobject ON subobject.subId = subrelation.ID;"); 

echo "<ul>"; 
while($obj = mysqli_fetch_array($objects) and $row = mysqli_fetch_array($join)) 
{ 

    echo "<li>". $obj['objectName']; 

    echo "<ul>"; 
    //ITERATION GOES HERE 
    if($obj['objectName'] == $row['subName']) 
     echo "<li>". "$row[className]" . "</li>"; 

    //END OF ITTERATION 
    echo "</ul>"; 
    echo "</li>"; 
} 

echo "</ul>"; 

?> 

и вывод списка:

-Test 
    -BOM 
-Sub 
    -Schematics 
-More 

под каждой области есть должны быть более перечисленных значений.

ответ

1

Похоже, вам нужно немного упростить код. Я предполагаю, что ваша проблема возникает из-за того, что в каждом результирующем наборе у вас разное количество строк. Это приводит к выходу петли while, когда она заканчивается через меньший результирующий набор (возможно, $objects), хотя в большом наборе еще есть элементы.

Решение состоит в том, чтобы отсортировать результаты запроса, используйте только одно условие в вашем while цикле, и отслеживать, какие objectName вы находитесь в данный момент, используя строку $curr_objectName:

$join = mysqli_query($con, 'SELECT * FROM subrelation AS subrelation INNER JOIN subobject AS subobject ON subobject.subId = subrelation.ID ORDER BY subobject.objectName;'); 

$curr_objectName = ''; 

echo '<ul>'; 

while($row = mysqli_fetch_array($join)) { 
    $subName = $row['subName']; 

    if($subName != $curr_objectName)) { 
     if($curr_objectName != '') { 
      #close the previous list 
      #will be skipped on the first loop iteration 
      echo '</ul>'; 
      echo '</li>'; 
     } 

     #start a new list 
     $curr_objectName = $subName; 

     echo '<li>'. $obj['objectName']; 
     echo '<ul>'; 
    } else { 
     echo '<li>'. $row['className'] . '</li>'; 
    } 
} 

echo '</ul>'; 
+0

действительно не изменить его .. это что-то с моим, если или я должен делать вложенные, если и в то время? – Cubatown

+0

Вы пробовали проверить это в командной строке mysql, чтобы убедиться, что запрос захватывает результаты, которые вы хотите? если это тогда, вы узнаете, что это проблема в вашем php. – sgroves

+0

У меня есть. Внутреннее соединение захватывает некоторые. внешнее соединение только подбирает первое значение списка. Я думаю, что это мой php. – Cubatown

Смежные вопросы