2016-09-09 8 views
0

HAVINGを使用して、必要な行がGROUP BYの範囲内にあるかどうかを確認する簡潔な方法はありますか?必要な行を "持っている"ことによるSQLグループ

例日付で

:私はHAVING COUNT(*) > 1ような何かを行うことができます実現し、それが偽を与えるだろう

SELECT turtle.name 
FROM turtle 
JOIN turtle_crush ON turtle_crush.turtle_id = turtle.turtle_id 
WHERE turtle_crush.crush_for IN ('Pizza', 'April Oneil') 
GROUP BY turtle.turtle_id 
HAVING (a crush on both "Pizza" and "April Oneil") 

turtle_id name 
1   Mike 
2   Ralph 
3   Leo 
4   Don 

turtle_id crush_for 
1   Pizza 
1   April Oneil 
2   April Oneil 
3   Pizza 
3   April Oneil 
4   Pizza 
4   Pizza 
4   Science 
4   April Oneil 

とSQL彼は「ピザ」を2度好きなので、ドン(ID 4)はポジティブです。

編集: ただ、彼がcrush_for「ピザ」が

+0

GROUP BYの前にWHEREを入れます。 – jarlh

+0

@Strawberryそれは良い点イチゴです。理想的には文字列(「ピザ」など)は良好な主キーを作成せず、すべてのテーブルを正規化する必要がありますが、それによって質問が簡単になります。 – aero

+0

@Strawberryより「正しい」シナリオでは、「INT」の主キーがそれぞれ1と2の「Pepperoni Pizza」や「Cheese Pizza」のようなものがあります。この2つのピザは、親カテゴリ "Food"に関連付けることができます。最初の質問では、少なくとも1つの「食べ物」アイテムと少なくとも1つの「人物」アイテムを酷使しているすべてのカメを返す方法を尋ねると、「親カテゴリ」テーブルに余分な「JOIN」が必要になりますおよび "items"テーブルを参照してください。 – aero

答えて

5

これは動作するはずはありませんラルフを返しますWHERE句の追加:このコードで

SELECT t.turtle_name 
FROM turtle t 
INNER JOIN (SELECT turtle_id 
      FROM turtle_crush 
      WHERE crush_for IN ('Pizza','April Oneil') 
      GROUP BY turtle_id 
      HAVING COUNT(DISTINCT crush_for) = 2) tc 
    on t.turtle_id = tc.turtle_id; 

、サブクエリを最初に結果をフィルタリングします。crush_for'Pizza'または'April Oneil'です。次に、turtle_idでグループ化し、2つの異なるcrush_forの値を持つturtle_idを選択する別の条件でグループ化します(したがって、両方が破損しているのはturtle_idです)。次に、turtleテーブルと結合して名前を取得します。

+0

でも、 'Science'と' Pizza'を押しつぶした 'turtle'があれば、' crush_for'の数になるでしょう。だからそれほど正しいわけではありませんか? – Nebi

+0

@Nebiいいえ、それは起こることはありません。なぜなら、WHERE crush_for IN( 'Pizza'、 'April Oneil') ' – Lamak

+0

+1 @ Lamak yeah、nevermindがあるからです。私は4月がなくてもPiaazaで2回考えましたが、どちらも問題ありません。私は間違っていた。 – Nebi

1

亀のIDでグループ化したWHERE句にクラッシュのリストを入れて、クラッシュタイプの別個の値を数え、2つ以上の値を持つグループだけを残してください:

SELECT turtle.name 
FROM turtle 
    INNER JOIN turtle_crush ON turtle_crush.turtle_id = turtle.turtle_id 
WHERE crush_for IN ("Pizza", "April Oneil") 
GROUP BY turtle.turtle_id 
HAVING COUNT(DISTINCT crush_for) = 2 
関連する問題