2010-02-26 6 views
3

для того, чтобы держать в несколько заявлений SQL, как это возможно, я хочу сделать выбранный набор из MySQL:результаты PHP/группы 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($categories as $category){ 
    foreach($products[$category] as $product){ 
    $output; 
    } 
} 

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

+2

Когда вы выбираете категорию GROUP BY, вы получаете только один продукт за каждую категорию в наборе результатов. Это то, что вы хотите? – mluebke

+0

@mlueabke: спасибо, я отредактировал свою инструкцию SQL с правильной группировкой - другой 'ORDER' вместо' GROUP BY' –

ответ

4

Как и 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 
    } 

}
+0

Спасибо, что сказал, что мои идеи в порядке: D –

+0

вот что он написан в ОП. – musafar006

2

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

+0

Спасибо за одобрение моего решения: D: D –

0

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

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

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 вы можете пройти через массив (псевдо-код):

$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']; 
    } 

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

+0

Благодарю вас за ответ. Я все равно не видел его, когда голосовал за ответ +1 в любом случае:] –

+0

Нет проблем, решение Alec выглядит немного аккуратно. Мне нужно научиться печатать быстрее! –

Смежные вопросы