PHP & MYSQL: использование группы по категориям

Моя база данных имеет следующие настройки

productid | productname | category id 

и я хочу вывести их так:

 category #1 item 1 item 2 item 3 category #2 item 1 item 2 item 3 

Я использовал группу по группе вместе, и это работает нормально, но я хочу прокрутить каждую группу и отобразить содержимое этой группы. Как мне это сделать?

Я бы рекомендовал простой запрос для извлечения всех строк, отсортированных по идентификатору категории. Выведите категорию только в том случае, если ее значение изменится с предыдущей строки.

 <?php $stmt = $pdo-> query("SELECT * FROM `myTable` ORDER BY categoryID"); $current_cat = null; while ($row = $stmt->fetch()) { if ($row["categoryID"] != $current_cat) { $current_cat = $row["categoryID"]; echo "Category #{$current_cat}\n"; } echo $row["productName"] . "\n"; } ?> 

Это должно работать:

 $categories = array(); $result= mysql_query("SELECT category_id, product_name FROM `table` GROUP BY `catagory_id` ORDER BY `catagory_id`"); while($row = mysql_fetch_assoc($result)){ $categories[$row['category_id']][] = $row['product_name']; } // any type of outout you like foreach($categories as $key => $category){ echo $key.'<br/>'; foreach($category as $item){ echo $item.'<br/>'; } } 

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

EDIT : результирующий массив может выглядеть так:

 $categories = array( 'cateogy_id_1' => array( 1 => 'item_1', 2 => 'item_2', ... ), 'cateogy_id_2' => array( 1 => 'item_1', 2 => 'item_2', ... ), .... ); 

Вы хотите заказать их по категории, а не группировать их.

 SELECT * FROM MyTable ORDER BY category_id, product_id 

Когда вы перебираете список, просто выводите новый заголовок всякий раз, когда изменяется категория_id.

Этот подход не требует сортировки данных по категориям.

Вы можете использовать php для группировки каждой категории во вложенном массиве. После этого данные могут быть легко отображены в таблице, переданы в библиотеку grap / chart и т. Д. …

 <?php $stmt = $pdo-> query("SELECT * FROM myTable ORDER BY categoryID"); $categories = []; //the array to hold the restructured data //here we group the rows from different categories together while ($row = $stmt->fetch()) { //i'm sure most of you will see that these two lines can be performed in one step $cat = $row["categoryID"]; //category id of current row $categories[$cat][] = $row; //push row into correct array } //and here we output the result foreach($categories as $current_cat => $catgory_rows) { echo "Category #{$current_cat}\n"; foreach($catgory_rows as $row) { echo $row["productName"] . "\n"; } } ?> 

Самый простой способ – это, пожалуй, вывести список категорий, перебрать и вытащить свои подключенные продукты. (Т. Е. Несколько запросов.)

Например (псевдокод):

  $ result = fetch_assoc ("SELECT category_id FROM categories");
 foreach ($ result as $ row)
 {
   echo $ row ['category_id'];
   $ result2 = fetch_assoc ("SELECT product_id FROM products");
   foreach ($ result2 as $ row2)
   {
     echo $ row2 ['product_id'];
   }
 }

Если вы хотите сделать все это в одном запросе, вы можете сделать что-то вроде:

  $ result = fetch_assoc ("SELECT product_id, category_id FROM products p JOIN category c ON p.category_id = c.category_id ORDER BY c.category_id ASC");
 $ last = null;
 foreach ($ result as $ row)
 {
   # Вывод категории при каждом изменении
   if ($ row ['category_id']! = last)
   {
     echo $ row ['category_id'];
     $ last = $ row ['category_id'];
   }
   echo $ row ['item_id'];
 } 

Затем вы можете перебирать результирующий набор и вытаскивать имя категории при каждом изменении.

Может быть более сложный, элегантный способ написать SQL, чтобы сделать все, прежде чем вы получите его из базы данных, но я не настолько умный. 😉

Примечание. Примеры используют псевдокод. Я использую класс абзаца mysql, который работает как:

  $ db-> query ("SELECT stuff");
 $ Db-> multi_result ();  // возвращает 2d-ассоциативный массив 

Затем я могу сделать foreach($db->multi_result() as $row) , что является супер ленивым и удивительным.

Я могу опубликовать код для слоя абстракции, если хотите.