Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Разбиение данных на категории

#php #mysql #pdo


Есть структура данных в базе

product1   category2
product2   category1
product3   category1
product4   category3
....


Мне необходимо вывести эти данные в select и сгруппировать с помощью optgroup, чтобы
по итогу было как то так

-category1
  --product2
  --product3

-category2
  --product1

-category3
  --product4


Я в целом смог сделать подобный вывод

                $STH = $DBH->query('SELECT * from product'); 
                $STH->setFetchMode(PDO::FETCH_ASSOC); 

                    $current_category = null;

                    while($row = $STH->fetch()) {   
                        if ($row["p_category"] != $current_category) {
                            $current_category = $row["p_category"];
                            echo "#{$current_category}";
                        }

                        echo "

{$row["p_name"]}

"; } Но в данном случае я не могу управлять группой,чтобы заключить ее в , так как я отдельно управляю названиями продукта и названиями категорий, а как сделать,чтобы можно было заключить отдельные группы в ?


Ответы

Ответ 1



Достаточно сортировку добавить в запрос и дополнить условия вывода: $STH = $DBH->query('SELECT * from product ORDER BY p_category, p_name'); $STH->setFetchMode(PDO::FETCH_ASSOC); $current_category = null; echo '';

Ответ 2



Если сгруппировать по категориям и воспользоваться GROUP_CONCAT для объединения продуктов для категории, то может получится что-то такое $STH = $DBH->query('SELECT `p_category`, GROUP_CONCAT(p_name) as `products` FROM `product` GROUP BY `p_category`' ); $STH->setFetchMode(PDO::FETCH_ASSOC); while($row = $STH->fetch()) { $current_category = $row["p_category"]; $products = explode(',', $row["products"]); //