2017-10-07 4 views
1

によって表から選択するために、どのように私はこのようなテーブルがある:はグループ

 
idjob category customer 
1560 001  1 
1560 0010  1 
1560 002  1 
1562 001  2 
1562 0010  2 
1563 001  2 
1563 002  3 
1563 0010  3 
1563 004  3 

ある顧客はより多くのidjobsを持つことができます。 すべての単一ジョブにはカテゴリのグループが含まれています。

私は、仕事によって2つ以上の詳細カテゴリを持つ顧客の番号を選択したいと考えています。

おそらく単純なクエリです。

どうすればいいですか?サブクエリを使用し、

select customer 
from t 
group by customer 
having min(category) <> max(category); 

は番号を取得するには:

SELECT customer, GROUP_CONCAT(idjob) AS jobs 
FROM  mytable 
GROUP BY customer 
HAVING COUNT(DISTINCT idjob) > 1 

答えて

0

あなたは、顧客ごとに異なるidjobの数を数えることができるありがとう:

select count(*) 
from (select customer 
     from t 
     group by customer 
     having min(category) <> max(category) 
    ) c; 

"2"は特殊ケース。これはmax()min()を比較することで処理できます。より一般的な解決方法はcount(distinct category) >= 2です。ただし、count(distinct)は、単純な集約関数よりもリソース集中型です。

編集:

恐らく私は元の質問を誤解しました。あなたがカテゴリの特定のセットを顧客にしたい場合は

、あなたはまだGROUP BYHAVINGを使用することができます。ここでは

select customer 
from t 
where category in (. . .) 
group by customer 
having count(*) = <n>; 

. . .したいカテゴリのリストです。 <n>は、そのリスト内のカテゴリの数です。

あなたはこのhaving使用し、その後、customer/category重複のペアを持つことができる場合は、次のどのカテゴリを指定しようとしている何

having count(distinct category) = <n> 
+1

を? – Ento

+0

@Entoあなたは 'group_concat'を使って全てをリストアップすることができます - 私の編集した回答を参照してください – Mureinik

0

あなたは、顧客が使用して条件を満たし得ることができます: は

+0

しかし、私はどのカテゴリを指定したいですか... – Ento

+0

それは動作するようです。しかし、operatore INにはORのような振る舞いがあります。例えば : T COUNT(*)=> 2を有する顧客 によって( '001'、 '0010') グループ内のカテゴリから選択して顧客 。 カテゴリ001または002のジョブを持つ顧客のリストを教えてください。 カテゴリを指定してすべての顧客のみを希望します。 私が試した: 選択顧客 をトン COUNT(*)=> 2を持つ顧客 によってカテゴリ=「001およびカテゴリ= '0010' グループから。 しかし、動作しません。ありがとうございます – Ento

+0

@Ento。 。 。 'OR'条件と' HAVING'節で指定されたとおりにクエリを実行します。元のデータに重複がある場合は(答えを更新した) 'COUNT(DISTINCT)'が必要です。 –