给出三个这样的表:
fruit: taste: fruit_taste:
id name id name id fruit_id taste_id
-- ---- -- ---- -- -------- --------
1 apple 1 sweet 1 1 1
2 lime 2 tart 2 1 2
3 banana 3 2 2
4 lemon 4 4 2
我如何才能SELECT
仅将{* 1}}未被加入表识别为具有甜蜜fruit
?我想要的结果也应该包括'香蕉',因为没有taste
认为它是甜的。
我尝试过(以及吨其他事情):
fruit_taste
哪个几乎有效,但仍然在我的结果中给了'苹果',因为我的苹果是格兰尼史密斯,并且既甜又酸。如何在查询中排除“apple”?我唯一的选择是SELECT *
FROM fruit
LEFT OUTER JOIN fruit_taste
ON fruit_taste.fruit_id = fruit.id
WHERE (fruit_taste.taste_id != 1 OR fruit_taste.id IS null)
的子查询吗?
答案 0 :(得分:1)
select *
from fruit
where id not in
(select ft.fruit_id
from fruit_taste ft
inner join taste t
on ft.taste_id = t.id
where t.name = 'sweet')
答案 1 :(得分:1)
除了使用NOT IN
之外,您还可以使用LEFT JOIN
。要过滤掉没有sweet
品味的水果,每个水果的sweet
总数应为0
。
SELECT a.ID, a.Name
FROM fruit a
LEFT JOIN fruit_taste b
ON a.id = b.fruit_id
LEFT JOIN taste c
ON b.taste_id = c.id
GROUP BY a.ID, a.Name
HAVING SUM(IFNULL(c.name = 'sweet', 0)) = 0
答案 2 :(得分:0)
如果将排除的味道添加到JOIN过滤器然后排除匹配的行,则可以使用LEFT JOIN并避免使用子查询。对于性能而言,这通常比在子查询上使用NOT IN更好,但是YMMV。
SELECT *
FROM fruit
LEFT JOIN fruit_taste
ON fruit_taste.fruit_id = fruit.id
AND fruit_taste.taste_id = 1
WHERE fruit_taste.id IS NULL