sql选择多对多关系不能按预期工作,EAV设计数据模型

时间:2011-07-21 18:37:17

标签: mysql sql database select many-to-many

关于多对多的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

我想展示同一产品的所有特征,而不仅仅是上面的两个......

我不能做一个选择来解决这个问题 拜托,我需要帮助 谢谢大家

1 个答案:

答案 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聚合技巧(你似乎对选择这个数据库布局感兴趣),那么这个就适合你了。