对不起标题,但这是我能想到解释它的最佳方式......这是我的方案
我有一个表,用于存储与客户进行通信的行。像这样的东西
| 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专家都会喜欢你的建议。
由于
答案 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')