假装我有一张cupcake_rating桌子:
id | cupcake | delicious_rating
--------------------------------------------
1 | Strawberry | Super Delicious
2 | Strawberry | Mouth Heaven
3 | Blueberry | Godly
4 | Blueberry | Super Delicious
Run Code Online (Sandbox Code Playgroud)
我想找到所有具有'Super Delicious'和'Mouth Heaven'评级的纸杯蛋糕.我觉得使用一个group by条款很容易实现,也许是一个having.
我刚在想:
select distinct(cupcake)
from cupcake_rating
group by cupcake
having delicious_rating in ('Super Delicious', 'Mouth Heaven')
Run Code Online (Sandbox Code Playgroud)
我知道我不能有两个单独的AND语句.我能够通过以下方式实现我的目标:
select distinct(cupcake)
from cupcake_rating
where cupcake in ( select cupcake
from cupcake_rating
where delicious_rating = 'Super Delicious' )
and cupcake in ( select cupcake
from cupcake_rating
where delicious_rating = 'Mouth Heaven' )
Run Code Online (Sandbox Code Playgroud)
这不会令人满意,因为一旦我添加了我想要的第三种评级,查询将花费数小时(有很多蛋糕评级).
你是对的,你可以使用HAVING子句; 也没有必要使用自联接.
你只想要一个有两个等级的蛋糕,所以限制这两个等级,然后检查DISTINCT等级数是否等于两个:
select cupcake
from cupcake_rating
where delicious_rating in ('Super Delicious', 'Mouth Heaven')
group by cupcake
having count(distinct delicious_rating) = 2
Run Code Online (Sandbox Code Playgroud)
这更容易扩展,因为您不需要为每个美味的评级进行新的自我加入,您只需要检查您是否拥有所需的数字.