【发布时间】:2014-08-14 19:26:00
【问题描述】:
我的数据库中有三个表
category_products 表包含类别和产品的 id
我应该如何使用 category_products 表来显示类别名称和每个类别下的产品信息?
产品表和类别表
【问题讨论】:
我的数据库中有三个表
category_products 表包含类别和产品的 id
我应该如何使用 category_products 表来显示类别名称和每个类别下的产品信息?
产品表和类别表
【问题讨论】:
这种结构称为多对多关联。中间表 category_products 通过存储 ID 的组合来连接来自类别和产品的记录。因此,一个类别可以有多个产品,而一个产品也可以有多个类别。
要查询此结构,请使用以下 SQL:
SELECT categories.cat_name, products.* FROM categories LEFT JOIN category_products ON categories.cat_id = category_products.cat_id LEFT JOIN products ON category_products.prd_id = products.prd_id ORDER BY categories.cat_name;
你可以像这样在 PHP 中获取数据,例如:
$result = mysql_query("SELECT categories.cat_name, products.* FROM categories LEFT JOIN category_products ON categories.cat_id = category_products.cat_id LEFT JOIN products ON category_products.prd_id = products.prd_id ORDER BY categories.cat_name;");
if (!$result) {
die('Error: ' . mysql_error());
}
$current_category = '';
while ($row = mysql_fetch_assoc($result)) {
if($row['cat_name'] != $current_category) {
echo $row['cat_name'] . "\n";
echo "--------------------\n";
$current_category = $row['cat_name'];
}
// output your product fields, you need to adapt these names to your columns
echo $row['prd_name'] . " | " . $row['prd_price'] . "\n";
}
注意对包含每个产品记录的类别名称的 cat_name 字段的处理。由于您可能不想在每一行中重复类别名称,因此该名称会被缓冲并仅在类别更改时打印。
【讨论】:
以下查询将返回具有对应类别的产品名称。
SELECT prd.name, cat.name FROM products AS prd JOIN category_products AS cp ON prd.id=cp.prd_id JOIN categories AS cat ON cat.id=cp.cat_id
【讨论】:
prd.name 和 cat.name 更改为正确的值。没有任何 SQL 错误的响应对您没有帮助。向我们提供有关您的桌子的线索。
根据@Wamprirue 的回答,这应该可以为您提供您正在寻找的特定结果。
SELECT cat.cat_name, COUNT(cp.prd_id)
FROM products AS prd
JOIN category_products AS cp
ON prd.prd_id = cp.prd_id
JOIN categories AS cat
ON cat.id = cp.cat_id
应生成包含所有类别名称的输出以及与该类别匹配的产品数量。
如果没有关于您的表格及其结构的额外信息,我们无法真正为您提供一个无需您进行几次编辑就可以 100% 确定工作的解决方案。
【讨论】: