返回满足mysql表中列的多个条件的行

时间:2016-04-12 12:00:44

标签: mysql

我有他们提供的医院和治疗(与子治疗相关)的mysql表。我需要在表上进行mysql查询,该表返回提供列表中给出的所有处理/子处理的医院。例如:

从下表中我需要提供列表中所有治疗的医院:(tretament_id,sub_treatment_id)=(1-1,1-2)。因此结果必须是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但它的工作方式与OR一样,因此返回医院4,只满足(1,1)。我怎样才能编写像WHERE IN这样的SQL查询但是它的工作方式与AND一样?

3 个答案:

答案 0 :(得分: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 :(得分: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)进行修复,但可能没有必要。

答案 2 :(得分: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';