这让我很生气。
我有三张桌子:
items
ID
name
type
cats
ID
name
items_to_cats
FK_ITEM_ID
FK_CAT_ID
这是一个简单的多对多关系。我有物品和类别。每个项目都可以链接到一个或多个类别。这是通过一个简单的连接表完成的,其中每一行使用外键约束维护一个项目和一个类别之间的关系。
你会注意到我的“items”表有一个名为“type”的字段。这是一个索引列,用于定义存储在其中的内容类型。这里的示例值是“报告”,“访谈”,“意见”等。
这是问题所在。 我想要检索至少包含一个“报告”类型项目的类别列表。
理想情况下,我希望使用连接在单个查询中获取结果。救命啊!
答案 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'
)