MySQL - 多连接

时间:2011-11-29 12:39:50

标签: php mysql database web-applications

我有一张桌子(类似的东西)

product: id, name, type
product_type: id, name, group_id
product_group: id, name

这个模型工作正常,我构建了一个连接表的查询,所以我可以要求获得所有产品组14或类型12的产品。

现在我遇到了一个问题,我需要为产品添加更多类型。

product: id, name, type, type_1, type_2, type_3
product_type: id, name, group_id
product_group: id, name

在此之后,我编写了一个可以检索type=12 or type_1=12 or type_2=12的查询,但我不知道如何编写将检索if group=14 or group_1=14的查询。

我的查询是:

SELECT product.*,  
       product_group.group_name 
FROM product,
     product_group,
     product_type 
WHERE product.product_type = product_type.id 
  AND product_group.id = product_type.product_group 
  AND product_group=14

我如何添加:

(... or product_group_1=14 or product_group_2=14)

感谢您的帮助,这里有一些例子

- product: id=2, name=cleaning kit, type=6 (photo accessorioes), type_1=9 (video accessorioes), type_2=33 (cleaning supply)
---------------------------------
- type: id=6, name=photo accessorioes, group=12 (photo equipment)
- type: id=9, name=video accessorioes, group=14 (video equipment)
- type: id=33, name=cleaning supply, group=31 (some group)
---------------------------------
- group: id=12, name=photo equipment
- group: id=14, name=video equipment
- group: id=31, name=some group

现在我需要查找第14组中的所有产品。

1 个答案:

答案 0 :(得分:3)

您可能想重新考虑您的模型。每当您开始命名列_1,_2,_3等时,通常表明您的架构未规范化。产品的不同类型有什么不同?你能介绍一个这样的连接表: product_types:product_id,type_id

EDIT 听起来你有多对多的关系(即每个产品可以有多个组,每个组可以有多个产品)。要在像MySQL这样的关系数据库中实现这一点,您需要一个表来将您的产品加入您的组中,如下所示:

product_groups: product_id, group_id

然后,您可以使用相关的group_id在该表上按JOINing查询组中的所有产品。

修改 根据您提供的示例数据,我将重构您的架构,如此

product: id=2, name=cleaning kit, 
---------------------------------
product_types: product_id=2, type_id=6 
product_types: product_id=2, type_id=9
product_types: product_id=2, type_id=33
---------------------------------
type: id=6, name=photo accessorioes, group=12 (photo equipment)
type: id=9, name=video accessorioes, group=14 (video equipment)
type: id=33, name=cleaning supply, group=31 (some group)
---------------------------------
group: id=12, name=photo equipment
group: id=14, name=video equipment
group: id=31, name=some group

product_types表是一个连接表,在product_id和type_id上​​有一个多列主键。这些列分别是与product.id和type.id相关的外键。