代码之家  ›  专栏  ›  技术社区  ›  Adam Kiss

PHP/MySQL按列分组结果

  •  3
  • Adam Kiss  · 技术社区  · 16 年前

    为了尽可能少地保留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($categories as $category){
      foreach($products[$category] as $product){
        $output;
      }
    }
    

    这是最好的,还是有什么神奇的东西 mysql_use_groupby 或者别的什么?

    3 回复  |  直到 16 年前
        1
  •  4
  •   Alec    16 年前

    喜欢 mluebke 注释,使用组意味着 一

    $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
  •  2
  •   bflesch    16 年前

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

        3
  •  0
  •   Jon M    16 年前

    如果是后者,最好:

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

    它将给您留下$cats作为一个数组,并将产品分类到其中。

    推荐文章