sql,当多行具有特定值时返回行?

sql,当多行具有特定值时返回行?,sql,join,Sql,Join,很抱歉这个标题,但这是我能想到的最好的解释方式。。。这是我的设想 我有一个存储行的表,用于与客户通信。像这样的 | UserID | CommunicationID ----------------------------- | User1 | com1 | User1 | com2 | User1 | com3 | User2 | com1 |

很抱歉这个标题,但这是我能想到的最好的解释方式。。。这是我的设想

我有一个存储行的表,用于与客户通信。像这样的

|  UserID  |  CommunicationID
-----------------------------
|  User1   |  com1              
|  User1   |  com2              
|  User1   |  com3              
|  User2   |  com1              
|  User2   |  com2              
|  User3   |  com1              
我要寻找的是一个查询,它只返回接收了所有3个通信的用户的UserID。因此,在上面的示例中,只返回User1

我忘了提到我只需要用户特别收到Com1、Com2和Com3的记录。无论他们收到任何一个com的次数是多少,他们都必须收到所有3个com

出现这个问题的原因是,一些用户多次错误地接收到com1,并抛出我的查询以正确识别用户

我自己也尝试过在(Com1,Com2,Com3)中使用CommunicationID,但这当然会回报所有人。我也曾考虑过让桌子重新回到自己的位置,但不能100%确定这会如何运作

任何一位sql专家,我都会喜欢你的建议

谢谢

试试这个:

SELECT UserID
FROM mytable
WHERE CommunicationID IN ('Com1', 'Com2', 'Com3') 
GROUP BY UserID
HAVING COUNT(DISTINCT CommunicationID) = 3

上述查询选择所有用户的
UserID
值,这些用户具有所有三个
CommunicationID
值,而不管每个不同的
CommunicationID
值在表中出现多少次

这种方法使用
WHERE
子句将其视为三个不同的元素,将它们相互连接起来。在连接结束时,只有所有三次跳跃都幸存下来的才会留在结果集中

SELECT
    DerivedCom3.UserID
FROM
    (
    SELECT DISTINCT
        UserID
    FROM
        YourTable
    WHERE
        CommunicationID = 'com1'
    ) DerivedCom1
    LEFT OUTER JOIN
    (
    SELECT DISTINCT
        UserID
    FROM
        YourTable
    WHERE
        CommunicationID = 'com2'
    ) DerivedCom2 ON DerivedCom2.UserID = DerivedCom1.UserID
    LEFT OUTER JOIN 
    (
    SELECT DISTINCT
        UserID
    FROM
        YourTable
    WHERE
        CommunicationID = 'com3'
    ) DerivedCom3 ON DerivedCom2.UserID = DerivedCom3.UserID
WHERE
    DerivedCom3.UserID IS NOT NULL

这会起作用,但可能会很慢,具体取决于表的大小和索引方式

SELECT UserID
FROM mytable
WHERE UserID IN(SELECT UserID FROM mytable WHERE CommunicationID = 'Com1')
AND UserID IN(SELECT UserID FROM mytable WHERE CommunicationID = 'Com2')
and UserID IN(SELECT UserID FROM mytable WHERE CommunicationID = 'Com3')

我知道这是怎么回事。如果User2错误地获取了Com1 3次,但没有其他时间,那么他也会被识别出来。我应该补充说,我只需要特别收到Com 1、Com 2和Com 3的用户,无论他们收到其中任何一个的次数如何them@JeremyRagsdale不,他不会被认出来。这就是
COUNT
DISTINCT
的基本功能:它只计算DISTINCT
CommunicationID
值。此表上的索引是什么?User1是否可能多次使用其中一个通信值?