1

假装我有一张cupcake_rating桌子:

id     |     cupcake      |    delicious_rating
--------------------------------------------
1      |     Strawberry   |    Super Delicious
2      |     Strawberry   |    Mouth Heaven
3      |     Blueberry    |    Godly
4      |     Blueberry    |    Super Delicious

我想找到所有具有“超级美味”和“嘴巴天堂”评级的纸杯蛋糕。我觉得这很容易使用一个group by子句和一个having.

我刚在想:

select distinct(cupcake) 
  from cupcake_rating 
 group by cupcake 
having delicious_rating in ('Super Delicious', 'Mouth Heaven')

我知道我不能有两个单独的 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' )

这不会令人满意,因为一旦我添加了我正在寻找的第三种类型的评级,查询将需要几个小时(有很多纸杯蛋糕评级)。

4

3 回答 3

7

你是对的,你可以使用 HAVING 子句;也不需要使用自联接。

你只想要一个有两个评级的纸杯蛋糕,所以限制在这两个评级上,然后检查 DISTINCT 评级数是否等于二:

select cupcake
  from cupcake_rating
 where delicious_rating in ('Super Delicious', 'Mouth Heaven')
 group by cupcake
having count(distinct delicious_rating) = 2

SQL小提琴

这更容易扩展,因为您不需要为每个美味评级进行新的自我加入,您只需检查您是否拥有所需的数字。

于 2013-06-26T20:45:52.807 回答
3

您可以在 上将所有“超级美味”评级加入“嘴巴天堂”评级cupcake。通过这种方式,您可以找到所有同时具有“超级美味”和“嘴巴天堂”评级的纸杯蛋糕。

SELECT DISTINCT cr.cupcake
FROM cupcake_rating cr
JOIN cupcake_rating cr2
    ON cr.cupcake = cr2.cupcake
WHERE cr.delicious_rating = 'Super Delicious'
    AND cr2.delicious_rating = 'Mouth Heaven'
于 2013-06-26T20:26:08.550 回答
1

I want to find all the cupcakes that have a 'Super Delicious' AND 'Mouth Heaven' rating

我理解上面的要求意味着纸杯蛋糕必须达到这些评级中的每一个,而不仅仅是一个或另一个。换句话说,如果每个人都将纸杯蛋糕评为嘴天堂,它就没有资格。

          select distinct cupcake from cupcake_ratings A where rating = 'super'
          inner join
          (
           select distinct cupcake from cupcake_ratings where rating = 'heaven'
          ) x
          on A.cupcake = x.cupcake

为您提供两种评分的纸杯蛋糕列表。

PS如果你有一个 CUPCAKES 表,你可能可以用 EXISTS 优化它:

         select cupcake from cupcakes
         where exists
         (
            select cupcake from ratings where rating = 'super'
            and ratings.cupcake = cupcakes.cupcake
         )

         and exists
         (
            select cupcake from ratings where rating = 'heaven'
            and ratings.cupcake = cupcakes.cupcake
         )
于 2013-06-26T20:34:06.250 回答