【问题标题】:want to get products group by category in mysql from multiple categories [duplicate]想从多个类别的mysql中按类别获取产品[重复]
【发布时间】:2014-07-31 10:22:21
【问题描述】:

我有 3 个表 - Product、category 和 product_category。

|------ product-------- |
|-Pid
|-Pname

|------ catrgory ----|
|-cat_id
|-cat_name

 |------ product_category --------------|
    |-product_id
    |-category_id

这是我的尝试。

$comp_query=mysql_query("SELECT DISTINCT p.Pname AS product_name, p.Pid AS product_id,
       c.cat_name AS category_name, c.cat_id AS category_id
FROM product AS p 
JOIN product_category AS pc ON p.Pid = pc.product_id
JOIN category AS c ON c.cat_id = pc.category_id
Order BY category_id");
while($row=mysql_fetch_array($comp_query)){

        echo " $row[category_name] -----";
        echo " $row[product_name]<br/> ";

}

此查询显示结果为:

Category1 ----- Category1-Product 1
Category1 ----- Category1-Product 2
Category1 ----- Category1-Product 3
Category2 ----- Category2-Product-1
Category2 ----- Category2-Product-2

但我想从每个类别中获取产品,例如:

**|-----Category1-----|**
|-Product-1
|-Product-2
|-Product-3

**|-----Category2-----|**
|-Product-1
|-Product-2
|-Product-3

**|-----Category3-----|**
|-Product-1
|-Product-2
|-Product-3

还有产品名称和其他详细信息。

请帮助我如何通过循环和查询来做到这一点。

【问题讨论】:

  • 如果一个产品只能有一个类别,那么只有两个表会容易得多:Product (Pid, Pname, Pcategory)Category (cat_id, cat_name)

标签: php mysql


【解决方案1】:

我建议你使用 2 个查询:

$q1 = mysql_query("SELECT * FROM catrgory ORDER BY cat_name");
while($cat = mysql_fetch_assoc($q1)) {
  print "**|-----".$cat['cat_name']."-----|**<br>";
  $q2 = mysql_query("SELECT * FROM product WHERE Pid IN (SELECT product_id FROM product_category WHERE category_id = ".$cat['cat_id'].") ORDER BY Pname");
  while($prod = mysql_fetch_assoc($q2)) {
     print " |***".$prod['Pname']."<br>";
  }
}

--> 更新-->

我提供了 2 个查询解决方案,因为我认为您想显示空类别...

在这种情况下,只需使用上面的查询并将“while”循环替换为:

$title_shown ='';
while($row=mysql_fetch_array($comp_query)){
  if($row['category_name'] != $title_shown) {
      $title_shown = $row['category_name'];
      print "\n**|-----".$row['category_name']."-----|**\n";
  }
  print "|-".$row['product_name']."\n";
}

【讨论】:

  • 谢谢,但此查询还显示了没有产品的类别
  • 这不是一个优化的解决方案,它将为每个类别运行查询,这将增加服务器上的负载,而不是我建议您使用一个按类别排序的连接查询并循环遍历结果,并在检查时重复使用类别只分类一次
  • acctually 我想这样做,我尝试了很多次。但没有解决办法。
【解决方案2】:

就我而言,您的查询看起来不错。您只需要在 php 级别对具有相同类别 id 的所有产品进行分组。只需使用 key=category_id 和 value = {产品数组}的地图。 并在您的 while 循环中填充此映射。 PSEUDO 代码中的片段只是为了了解主要思想:

    while(...) {
        if (map.containsKey(category_id) {
             map.get(category_id).add(product);
        } else {
             Array products = new Array();
             products.add(product);
             map.put(category_id, products)
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多