Sütuna göre PHP / MySQL grup sonuçları

3 Cevap php

Mümkün olduğunca az SQL ifadeleri tutmak için, ben MySQL select set yapmak istiyorum:

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

Şimdi, ben bir şekilde aşağıdaki ürünlerin listesi var:

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

MySQL sonucu işlemek için en iyi ve en verimli yolu nedir?

Ben (pseudo PHP) gibi bir şey düşündüm

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

it çıkış zaman ve daha sonra, foreach döngü yapmak:

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

Bu iyi mi, ya da mysql_use_groupby falan gibi büyülü bir şey mi?

3 Cevap

mluebke, yorumladı GRUBU kullanarak sadece one her kategori için sonuç almak anlamına gelir gibi. Size bir örnek olarak verdi listeye dayanarak, ben böyle bir şey istiyorum düşünüyorum:

$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
}

Ve sonra dizi döngü. Örnek:

foreach ($list as $category => $products) {
  echo '<h1>' . $category . '</h1>';

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

}

Hayır, ben çözüm bu sorun için iyi olduğunu düşünüyorum. Bu ne sizin için önemli olan daha sonra çıktı gibi görünüyor, böylece yaklaşımı ile sopa gerekir.

Eğer kategorilerin bir listesini almak istiyorsunuz ya da aslında tüm ürünler kategoriler halinde gruplandırılmış olsun?

Bu ikincisi ise, en iyisini yapmak için:

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))

Sonra PHP Eğer dizi (pseudo code) gidebilirsiniz:

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

Içine kriteri ürünleri ile bir dizi olarak $ kedi ile size bırakacaktır.