PHP sql-запрос под тем же названием

Я пытаюсь сделать сайт ресторана, где люди могут видеть меню.

У меня есть таблица, которая выглядит так:

введите описание изображения здесь

И теперь я хочу вывести эти данные по названию:

Пицца

Ветчина и сыр 150 долларов

Лук и сыр $ 120

Салат

Цезарь $ 70

Томаты и оливки 60 долларов США

Десерт

Мороженое $ 110

Ванильный торт $ 90

Ну и в будущем menu_title может быть изменен клиентом … Это означает, что название нужно также получить из базы данных.

Вот код, который я пытаюсь, но у меня нет идеи, как добавить контент под заголовком:

<?PHP $sql_product="SELECT * FROM cc_restaurants_menu WHERE menu_asoc='$asoc' AND menu_type='product' GROUP BY menu_title"; $stmt_product = $conn->prepare($sql_product); $stmt_product->execute(); $result_product = $stmt_product->setFetchMode(PDO::FETCH_ASSOC); if($result_product > 0) { while($row = $stmt_product->fetch()) { echo '<h3>'. $row['menu_title'] .'</h3><br><p>'. $row['menu_product'] .'</p>'; } } ?> 

Но этот код выводит только заголовок и первую строку: S

Есть идеи?

РЕДАКТИРОВАТЬ

Я получил 2 ответа правильно:

ОПЦИЯ 1

 $sql_product="SELECT * FROM cc_restaurants_menu WHERE menu_asoc='$asoc' AND menu_type='product'"; $stmt_product = $conn->prepare($sql_product); $stmt_product->execute(); $result_product = $stmt_product->setFetchMode(PDO::FETCH_ASSOC); if($result_product > 0) { while($row = $stmt_product->fetch()) { $menuArr[$row['menu_title']][] = '<p>'. $row['menu_product'] . ''. $row['menu_product_price'] . ''. $row['menu_product_desc'] .'</p>'; } foreach($menuArr as $menuTitle => $productArr){ echo '<h3>'. $menuTitle .'</h3></br>'; foreach($productArr as $key =>$productname){ echo '<p>'. $productname .'</p>'; } } } 

ВАРИАНТ 2

 $sql_product="SELECT * FROM cc_restaurants_menu WHERE menu_asoc='$asoc' AND menu_type='product' ORDER BY menu_title"; $stmt_product = $conn->prepare($sql_product); $stmt_product->execute(); $result_product = $stmt_product->setFetchMode(PDO::FETCH_ASSOC); $title = ""; while ($row = $stmt_product->fetch()) { if ($row['menu_title'] != $title) { echo '<h3>'.$row['menu_title'].'</h3><br>'; $title = $row['menu_title']; } echo '<p>'.$row['menu_product'].'</p><p>'.$row['menu_product_price'].'</p>'; } 

Попробуйте это

 $sql_product="SELECT * FROM cc_restaurants_menu WHERE menu_asoc='$asoc' AND menu_type='product'"; $stmt_product = $conn->prepare($sql_product); $stmt_product->execute(); $result_product = $stmt_product->setFetchMode(PDO::FETCH_ASSOC); if($result_product > 0) { while($row = $stmt_product->fetch()) { $menuArr[$row['menu_title']][] = $row['menu_product'] . " ".$row['menu_price']; } foreach($menuArr as $menuTitle => $productArr){ echo '<h3>'. $menuTitle .'</h3>'; foreach($productArr as $key =>$productname){ echo '<p>'. $productname .'</p>'; } } } 

Я бы предпочел сделать это: просто SELECT * ... ORDER BY menu_title , а затем отсортируйте его в PHP:

 $title = ""; while ($row = $stmt_product->fetch()) { if ($row['menu_title'] != $title) echo '<h3>'.$row['menu_title'].'</h3><br>'; $title = $row['menu_title']; echo '<p>'.$row['menu_product'].'</p>'; } 

GROUP BY вернет 1 строку для каждого уникального значения – вот почему вы видите только 1 строку.

Опция 1

Используйте этот запрос для вывода «заголовка меню», передавая название меню второму запросу внутри цикла, чтобы возвращать строки, соответствующие заголовку меню.

Вариант 2

Удалите GROUP BY в своем запросе, просмотрите результаты, используя «логику», чтобы выводить только название меню, если оно отличается от предыдущего заголовка меню.