3

SQLステートメントをできるだけ少なくするために、MySQLからsetsetを選択します。

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ものですか?

4

3 に答える 3

4

mluebkeコメントしたように、GROUP を使用すると、カテゴリごとに1 つの結果しか得られないことを意味します。例として挙げたリストに基づいて、次のようなものが必要だと思います。

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

}
于 2010-02-26T21:44:55.303 に答える
2

いいえ、あなたの解決策がこの問題に最適だと思います。あなたにとって重要なのは後の出力であるように思われるので、あなたはあなたのアプローチに固執するべきです。

于 2010-02-26T18:21:42.530 に答える
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'];
    }

これにより、製品がソートされた配列として $cats が残ります。

于 2010-02-26T21:50:00.447 に答える