加入MySQL多对多表

时间:2011-08-23 15:13:16

标签: mysql database join many-to-many

这让我很生气。

我有三张桌子:

items
  ID
  name
  type

cats
  ID
  name

items_to_cats
  FK_ITEM_ID
  FK_CAT_ID

这是一个简单的多对多关系。我有物品和类别。每个项目都可以链接到一个或多个类别。这是通过一个简单的连接表完成的,其中每一行使用外键约束维护一个项目和一个类别之间的关系。

你会注意到我的“items”表有一个名为“type”的字段。这是一个索引列,用于定义存储在其中的内容类型。这里的示例值是“报告”,“访谈”,“意见”等。

这是问题所在。 我想要检索至少包含一个“报告”类型项目的类别列表

理想情况下,我希望使用连接在单个查询中获取结果。救命啊!

2 个答案:

答案 0 :(得分:3)

select distinct cats.id, cats.name
from cats
join items_to_cats on items_to_cats.fk_cat_id=cats.id
join items on items.id=items_to_cats.fk_item_id
where items.type='report'

就像数据库设计的一个点,如果你有一小部分关于items.type的合法值,即“报告”,“采访”,“意见”,也许还有几个,那么你真的应该创建一个单独的用于表示id和名称的表,然后将类型id放在items表中。这样你就不会遇到麻烦,因为它错误地拼写了“raport”,甚至更可能是有人把“报告”而不是“报告”。

答案 1 :(得分:1)

或者如何:

SELECT c.id, c.name 
FROM cats c
WHERE c.id IN 
    (SELECT ic.fk_cat_id 
     FROM items_to_cats ic 
     JOIN items i on i.id=ic.fk_item_id 
     WHERE items.type='report'
    )