我有3个表 - 产品,类别和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
BUt我想从每个类别中获取产品,如:
**|-----Category1-----|**
|-Product-1
|-Product-2
|-Product-3
**|-----Category2-----|**
|-Product-1
|-Product-2
|-Product-3
**|-----Category3-----|**
|-Product-1
|-Product-2
|-Product-3
还有产品名称和其他详细信息。
请帮助我如何通过循环和查询来完成此操作。
答案 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)
}
}