SELECT语句通过连接表关系排除结果

时间:2013-11-22 18:05:59

标签: sql select jointable

给出三个这样的表:

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) 的子查询吗?

3 个答案:

答案 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