关于多对多的sql select不能按预期工作
我有以下多对多关系表:
table product:
prd_cod (pk)
cat_cod (fk)
prd_nome
table description_characteristic:
prd_cod(fk)
id_characteristic(fk)
description
table characteristic:
id_characteristic(pk)
name
我们假设cat_cod为1,所以我想显示所有类别代码等于1的产品,这些产品将在php中动态提供参数...
我在下面做了这个选择以解决我的问题:
select p.prd_cod,p.prd_name,c.name_characteristic,dc.description
from product p,description_characteristic dc, characteristic c
where p.prd_cod = dc.prd_cod and
dc.id_ccharacteristic = c.id_characteristic and
p.cat_cod = 1
但数据显示方式如下:
Prd_cod Prd_name name_characteristic descript
1 pen Color pink
1 Pen manufacturer kingston
1 Pen type brush
1 Pen weight 0.020
我想以这种方式显示结果:
Prd_cod Prd_name name_characteristic descript name_characteristic descript
1 pen Color pink type brush
2 Pen-drive manufacturer kingston weight 0.020
我想展示同一产品的所有特征,而不仅仅是上面的两个......
我不能做一个选择来解决这个问题 拜托,我需要帮助 谢谢大家
答案 0 :(得分:0)
正如Tom H.所说,您的数据库布局通常可能是一个坏主意,您可能会重新考虑它。也就是说,没有真正干净的解决方案可以生成您想要的mysql结果集。但你可能会像这样使用GROUP_CONCAT疯狂的东西,通过一些PHP端后处理来重现真实数据:
SELECT p.prd_cod, p.prd_name, GROUP_CONCAT(c.name_characteristic), GROUP_CONCAT(dc.description)
from product p,description_characteristic dc, characteristic c
where p.prd_cod = dc.prd_cod and
dc.id_ccharacteristic = c.id_characteristic and
p.cat_cod = 1
GROUP BY p.prd_cod
这应该返回类似
的内容Prd_cod Prd_name name_characteristic descript
1 pen Color,manufacturer pink,Apple
此结果集应按照以下方式进行后处理:
$out = array();
foreach ($result as $res) {
$p = array_combine(
explode(",", $res["name_characteristic"]),
explode(",", $res["descript"]));
$p["prd_cod"] = $res["prd_cod"];
$out[] = $p;
}
我不认为这是一个强大的解决方案 - 例如,你的价值观中的逗号搞砸了。如果你想避免这样的疯狂,你必须对你已经得到的结果进行后处理。
但是如果你想展示一些疯狂的SQL聚合技巧(你似乎对选择这个数据库布局感兴趣),那么这个就适合你了。