2016-10-05 9 views
4

属性、ここに私のテーブルです:Mysqlのカウント行だから

Id | name | Store 
001 | John | A 
001 | John | A  
001 | John | A  
001 | John | B 
001 | John | B 
001 | John | D 
002 | Bob | B 
002 | Bob | C 
003 | Dave | C 
004 | Pamela | A 
004 | Pamela | B 
004 | Pamela | C 
005 | Nick | D 
005 | Nick | D 
005 | Nick | D 
  1. は、どのように私はAとBのみ
  2. 、その後、AとBで買い物をしたすべての人を数え、次に選択することができますか?
  3. A OR Bだがほかに何か?
  4. Dのみ?私の例では

予想される結果である:(1)ジョン+パメラ、(2) Bでのショッピングの人々のジョン、(3)ジョン(4)ニック

答えて

3

名(とおそらく他の場所):

SELECT name 
FROM yourTable 
GROUP BY name 
HAVING SUM(CASE WHEN Store = 'A' THEN 1 END) > 0 AND -- A is present 
     SUM(CASE WHEN Store = 'B' THEN 1 END) > 0  -- B is present 

又は Bに有する人々の名前(しかしなし):

SELECT name 
FROM yourTable 
GROUP BY name 
HAVING (SUM(CASE WHEN Store = 'A' THEN 1 END) > 0 OR   -- A is present 
     SUM(CASE WHEN Store = 'B' THEN 1 END) > 0) AND   -- B is present 
     SUM(CASE WHEN Store NOT IN ('A', 'B') THEN 1 END) = 0 -- only A or B 

のみ Aでを買い物人々の名称およびB:店舗Dでのみ買い物人々の

SELECT name 
FROM yourTable 
GROUP BY name 
HAVING SUM(CASE WHEN Store = 'A' THEN 1 END) > 0 AND -- A is present 
     SUM(CASE WHEN Store = 'B' THEN 1 END) > 0 AND -- B is present 
     COUNT(DISTINCT Store) = 2      -- only A and B are present 

名:

SELECT name 
FROM yourTable 
GROUP BY name 
HAVING SUM(CASE WHEN Store <> 'D' THEN 1 END) = 0  -- only store D 

ここでは2番目のクエリのためのデモ:

SQLFiddle

+0

偉大な答えティムとゴードン。 (3)A OR Bだが他にはない? – SamanthaAlexandria

+0

多くのケースをカバーするために質問を更新しました。 Dさんはどうですか? – SamanthaAlexandria

+0

私の答えは再び更新されました。 –

2

私は、 group byhavingを使用して電子クエリ:

select name 
from t 
group by name 
having sum(store = 'A') > 0 and 
     sum(store = 'B') > 0; 

これは両方の店で買い物している人々を取得します。あなただけの2つの店だけが必要な場合:

select name 
from t 
group by name 
having sum(store = 'A') > 0 and 
     sum(store = 'B') > 0 and 
     sum(store not in ('A', 'B')) = 0; 
関連する問題