Результаты группы PHP / MySQL по столбцам

чтобы сохранить как можно меньше SQL-операторов, я хочу сделать выбор из MySQL:

SELECT * FROM products WHERE category IN (10,120,150,500) ORDER BY category,id; 

Теперь у меня есть список продуктов следующим образом:

 CATEGORY - product 1 - product 2 CATEGORY 2 - product 37 ... 

Какой лучший и наиболее эффективный способ обработки результата MySQL?

Я думал, что-то вроде (псевдо PHP)

 foreach ($product = fetch__assoc($result)){ $products[$category][] = $product; } 

а затем, выведя его, выполните цикл foreach:

 foreach($categories as $category){ foreach($products[$category] as $product){ $output; } } 

Это лучшее, или что-то волшебное, как mysql_use_groupby или что-то в этом роде?

Как прокомментировал mluebke , использование GROUP означает, что вы получаете только один результат для каждой категории. Основываясь на списке, который вы дали в качестве примера, я думаю, вам нужно что-то вроде этого:

 $sql = "SELECT * FROM products WHERE category IN (10,120,150,500) GROUP BY category ORDER BY category, id"; $res = mysql_query($sql); $list = array(); while ($r = mysql_fetch_object($res)) { $list[$r->category][$r->id]['name'] = $r->name; $list[$r->category][$r->id]['whatever'] = $r->whatever; // etc } 

А затем прокрутите массив. Пример:

 foreach ($list as $category => $products) { echo '<h1>' . $category . '</h1>'; foreach ($products as $productId => $productInfo) { echo 'Product ' . $productId . ': ' . $productInfo['name']; // etc } } 

Нет, я думаю, что ваше решение является лучшим для этой проблемы. Похоже, что для вас важна последующая работа, поэтому вы должны придерживаться своего подхода.

Вы хотите получить список категорий или фактически получить все продукты, сгруппированные по категориям?

Если это последнее, лучше всего делать:

 SELECT p.product_id, p.name, p.category_id, c.name AS category FROM products p JOIN categories c ON (c.category_id = p.category_id AND p.category_id IN (x,y,z)) 

Затем в PHP вы можете пройти через массив (код psuedo):

  $cats = array(); foreach($products as $product) { if(!in_array($product['category'], $cats)) { $cats[$product['category_id']] = $product['category']; } $cats[$product['category_id']][$product['product_id']] = $product['name']; } 

Который оставит вас с $ cat в качестве массива с продуктами, отсортированными по нему.