按列对PHP/MySQL结果进行分组

3
为了尽可能减少SQL语句数量,我想从MySQL中进行select set操作:
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这样的神奇方法?


3
当你按分类分组时,结果集中每个分类只会出现一个产品。这是否是你想要的结果? - mluebke
@mlueabke:谢谢,我已经编辑了我的SQL语句,使用正确的分组 - 另一个ORDER而不是GROUP BY - Adam Kiss
3个回答

3

就像 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
  }

}

2

不,我认为你的解决方案是这个问题中最好的。看起来对你来说最重要的是后面的输出结果,所以你应该坚持你的方法。


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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接