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

时间:2016-01-29 16:19:58

标签: sql join

对不起标题,但这是我能想到解释它的最佳方式......这是我的方案

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

|  UserID  |  CommunicationID
-----------------------------
|  User1   |  com1              
|  User1   |  com2              
|  User1   |  com3              
|  User2   |  com1              
|  User2   |  com2              
|  User3   |  com1              

我正在寻找的是一个只为已经收到ALL 3通信的用户返回UserID的查询。因此,在上面的示例中,只返回User1。

我忘了提到我只需要用户特别收到Com1& amp; Com2& COM3。无论他们收到任何一个com多少次,他们都必须收到所有3个。

出现这个问题是因为有些用户多次错误地收到了com1,而且我的查询被错误地识别了。

我自己尝试了CommunicationID IN(Com1,Com2,Com3),但当然这会让所有人回归。我还想把桌子加回到自身,但不能100%确定这是怎么回事。

任何sql专家都会喜欢你的建议。

由于

3 个答案:

答案 0 :(得分:1)

试试这个:

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

以上查询选择所有三个 UserID值的所有用户的CommunicationID值,无论每个不同{{em>多少次{{1>} 1}}值出现在表格中。

答案 1 :(得分:1)

这种方法使用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

答案 2 :(得分:1)

这可行,但可能会很慢,具体取决于表格的大小以及索引的编制方式。

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')