2016-04-12 16 views
4

私は、それらが提供する病院と治療(サブ治療に関連する)を持つmysqlテーブルを持っています。私はリストに与えられたすべての治療/ sub_treatmentを提供する病院を返すテーブルに対してmysqlクエリを作成する必要があります。例:列の複数の条件を満たす行をmysqlテーブルから返す

以下の表から、すべての治療をリストで提供する必要があります:(tretament_id、sub_treatment_id)=(1-1,1-2)。だから私がINしようとしたが、それは次のように動作しますかそこらだけ満たす病院4(1,1)を返し、ID 1と8

hospital_id | treatment_id | sub_treatment_id 
    ------------------------------------------------- 
    1    |    1 |    1 
    1    |    1 |    2  
    1    |    1 |    3 
    _________________________________________________ 
    4    |    1 |    1 
    4    |    2 |    1 
    _________________________________________________ 
    8    |    1 |    1 
    8    |    1 |    2 
    _________________________________________________ 
    7    |    2 |    1 

と病院でなければならない結果。どのようにWHERE INのようなSQLクエリを書くことができますか?ANDのように動作しますか?

答えて

2

これを試してみてください:

SELECT hospital_id 
FROM mytable 
WHERE (treatment_id, sub_treatment_id) IN ((1, 1), (1, 2)) 
GROUP BY hospital_id 
HAVING COUNT(CASE 
       WHEN (treatment_id, sub_treatment_id) IN ((1, 1), (1, 2)) 
       THEN 1 
      END) = 2 

Demo here

1

あなたがgroup byhavingを使用してこれを行うことができます。

select hospital_id 
from t 
where treatment_id = 1 and sub_treatment_id in (1, 2) 
group by hospital_id 
having count(*) = 2; 

注:これは、テーブル内の重複しないことを前提としています。 count(distinct)を使用して修正するのは簡単ですが、おそらく必要ありません。

+0

は "どこtreatment_id = 1" の制限があります。リストは動的なので、(1-1,1-2,3-4,4-2など)。 @zenwarrior。 – zenprogrammer

+0

。 。その特定の 'where'節はあなたの質問の条件を表現する最も簡単な方法と思われました。明らかに、他の条件のために 'where'節を変更する必要があります。 –

1

はここGROUP_CONCATJOINを使用したソリューションである:それはこのクエリのように思える

select distinct t.hospital_id 
from hospitals h and treatments t ON h.id = t.hospital_id 
having GROUP_CONCAT(CONCAT(t.treatment_id, '-', t.sub_treatment_id) 
        ORDER BY t.treatment_id, t.sub_treatment_id) 
        = '1-1,1-2'; 
関連する問題