想要从多个类别的mysql中按类别获取产品

时间:2014-07-31 10:22:21

标签: php mysql

我有3个表 - 产品,类别和product_category。

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

Product table data

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

category table data

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

product_table data

这是我的尝试。

$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

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

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

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

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

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

请帮助我如何通过循环和查询来完成此操作。

2 个答案:

答案 0 :(得分: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>";
  }
}

- &GT;更新 - &gt;

我提供了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";
}

答案 1 :(得分:1)

至于我,你的查询看起来不错。您只需要在php级别对具有相同类别ID的所有产品进行分组。只需使用key = category_id和value = {arrays of products}的地图。 并在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)
        }
    }