仅当匹配所有列表值时才返回行 [英] Return rows only if matches all list values

查看:11
本文介绍了仅当匹配所有列表值时才返回行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个表customers

-----------------
|id|name|country|
|1 |Joe |Mexico |
|2 |Mary|USA |
|3 |Jim |France |
-----------------

和表格languages

-------------
|id|language|
|1 |English |
|2 |Spanish |
|3 |French |
-------------

和表格cust_lang

------------------
|id|custId|langId|
|1 |1 |1 |
|2 |1 |2 |
|3 |2 |1 |
|4 |3 |3 |
------------------

给出一个列表:["英语"、"西班牙语"、"葡萄牙语"] 使用WHERE IN作为列表,它仍然会返回ID为1,2的客户,因为他们匹配"English"和"西班牙语"。 但是,返回的结果应该是0行,因为没有客户匹配所有三个术语。 我只希望返回与CUST_LANG表匹配的客户ID。 例如,给出一个列表:["英语","西班牙语"] 我希望结果为客户ID 1,因为只有他会说两种语言。

编辑:@GordonLinoff-这样就可以了!!

现在让它更复杂,这个额外的相关查询有什么问题:

假设我还有一个表degrees

-----------
|id|degree|
|1 |PHD |
|2 |BA |
|3 |MD |
-----------

对应的连接表cust_deg

------------------
|id|custId|degId |
|1 |1 |1 |
|2 |1 |2 |
|3 |2 |1 |
|4 |3 |3 |
------------------

以下查询不起作用。但是,它是两个相同的查询的组合。结果应该只是匹配两个列表的行,而不是一个列表。

SELECT * FROM customers C
    WHERE C.id IN (
    SELECT CL.langId FROM cust_lang CL
    JOIN languages L on CL.langId = L.id 
    WHERE L.language IN ("English", "Spanish")
    GROUP BY CL.langID 
    HAVING COUNT(*) = 2) 
AND C.id IN (
        SELECT CD.custId FROM cust_deg CD
        JOIN degrees D ON CD.degID = D.id 
        WHERE D.degree IN ("PHD", "BA") 
        GROUP BY CD.custId HAVING COUNT(*) = 2));`

EDIT2:我想我修好了。我不小心在里面多了一条SELECT语句。

推荐答案

您可以使用group byhaving

来执行此操作
select cl.custid
from cust_lang cl join
     languages l
     on cl.langid = l.id
where l.language in ('English', 'Spanish', 'Portuguese')
group by cl.custid
having count(*) = 3;

例如,如果您只想检查两种语言,则只需更改WHERE ... INHAVING条件,例如:

where l.language in ('English', 'Spanish')

having count(*) = 2

这篇关于仅当匹配所有列表值时才返回行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆