2013-05-26 3 views
2

У меня возникли проблемы с попыткой получить вложенный < ul> внутри цикла while. Я не уверен, что это возможно, поэтому я открыт для альтернатив.Как создать вложенный список внутри цикла while?

Here's a quick image of what my database looks like and what i'm trying to achieve.

Вот мой SQL

SELECT * 
FROM drinks_category, drinks_lookup, drinks 
WHERE drinks.drink_id = drinks_lookup.drink_id 
AND drinks_lookup.drinks_category_id = drinks_category.drinks_category_id 
ORDER BY drinks_category.drinks_category_title 

Вот мой выход PHP

$result = $conn->query($sql) or die(mysqli_error()); 

$last_category = 0; 

while ($row = $result->fetch_assoc()) { 

    if($row['drinks_category_id'] != $last_category) { 
    echo "<h1>" . $row['drinks_category_title'] . "</h1>"; 
    } 

    echo "<p>" . $row['drink_name'] . "</p>"; 
    $last_category = $row['drinks_category_id']; 

} 

Im используя MySQLi и PHP. Заранее спасибо!

+0

Вам действительно нужны таблица поиска (category_id легко может храниться в напитках Таблица)? И лично я бы разрешил это с двумя запросами, один для категории, один для самих напитков (я не знаю о лучшей практике в этом случае) – kero

+0

Может ли напиток иметь несколько категорий? Если это невозможно, вам не нужна таблица соединений (та, которая связывает Drinks с категориями). –

+0

Некоторые напитки действительно подпадают под несколько категорий. Спасибо за предложения! –

ответ

1

Обновите while цикл к следующему:

while ($row = $result->fetch_assoc()) { 

if($row['drinks_category_id'] != $last_category) { 
if($last_category != 0) echo '</ul>'; 
echo "<h1>" . $row['drinks_category_title'] . "</h1>"; 
echo "<ul>"; 
} 

echo "<li>" . $row['drink_name'] . "</li>"; 
$last_category = $row['drinks_category_id']; 

} 
if($last_category != 0) echo "</ul>"; 
+0

[В нижней части этого изображения есть вывод, который я надеялся получить.] (Http://i.imgur.com/75u2cVf.jpg) –

+0

Это сработало отлично, спасибо! –

0

Вместо того, 3 таблицы, вы можете просто добавить CATEGORY_ID к столу напитков, просто чтобы упростить вещи. Тогда вы можете сделать это:

SELECT drink_name, (SELECT drnk_category_title FROM drinks_category WHERE drink_category_id = drink_category // THE COLUMN I SUGGESTED //) AS title FROM drinks 

И тогда вы можете зациклить результат и построить узлы вы хотите на самом деле легко

0
$result = $conn->query($sql) or die(mysqli_error()); 

$last_category = 0; 

while ($row = $result->fetch_assoc()) { 

    if($row['drinks_category_id'] != $last_category) { 
     // close previous </ul> 
     if($last_category != 0) echo "</ul>"; 

     // new title 
     echo "<h1>" . $row['drinks_category_title'] . "</h1>"; 

     // new <ul> 
     echo "<ul>"; 

     $last_category = $row['drinks_category_id']; 
    } 

    echo "<li>" . $row['drink_name'] . "</li>"; 
} 

// close last </ul> 
if($last_category != 0) echo "</ul>"; 
Смежные вопросы