问题 如何查询连接表以满足多个条件?


我有一个有2列的表(见下文)。成员可以对问题进行多次回复:

RESPONSES
---------
member_id  INT
response_id  INT
SAMPLE DATA
member_id -- response_id
    1     --     3
    1     --     5
    2     --     1
    2     --     5
    2     --     9
    3     --     1
    3     --     5
    3     --     6

我需要做的是查询表中符合所有响应条件的成员。例如,我需要选择response_id为1 AND 5的所有成员。我使用以下查询:

SELECT DISTINCT member_id 
FROM responses 
WHERE response_id = 1 AND response_id = 5

我希望能回到member_id的2和3.但是我没有得到任何回报。我使用了EXPLAIN,它显示我的查询位置有错误。我究竟做错了什么?

此外,是否存在类似于IN的函数,其中必须满足所有条件才能返回true?


10452
2017-09-08 03:25


起源

在我看来,你需要 OR 代替 AND 那里。 - hjpotter92
WHERE条件分别应用于每一行。因此,它永远不会成立,因为列不能同时等于1和5。 - Andriy M


答案:


这应该工作:

SELECT member_ID
FROM responses
WHERE response_ID IN (1,5)
GROUP BY member_ID
HAVING COUNT(DISTINCT response_id) = 2

您需要计算返回的记录数,该数等于您提供的值的数量 IN 条款。

SQLFiddle演示 


10
2017-09-08 03:28



HAVING COUNT(DISTINCT response_id) = 2 捕获成员已经两次回答相同值的情况。 - podiluska
@podiluska是的,我忽略了这句话 member can have multiple responses to a question。谢谢你。 - John Woo
这并不意味着会员可以拥有多个 相同 尽管如此。尽管如此,OP并未澄清相同的响应是否可能,因此最好是安全并使用 COUNT(DISTINCT)。但我会在答案中澄清,如果确保多个相同的答案是不可能的, COUNT(*) 会更好,因为 DISTINCT 增加了一些开销。 - Andriy M