SQL:根据两列值过滤结果集中的重复项
问题描述:
我有一个从两种形式收集反馈的网站。我有一个SQL查询,返回通过其中一个或两个提交反馈的用户的姓名。反馈表在表格的feedback
列中给出ID 5和6。SQL:根据两列值过滤结果集中的重复项
SELECT 1.firstname, 1.lastname, 2.feedback, 2.timemodified
FROM 1
INNER JOIN 2 ON 1.id = 2.userid
ORDER BY 1.lastname
这个返回结果集,看起来像这样:
firstname lastname feedback timemodified
--------- -------- -------- ------------
john doe 5 1471012069
john doe 6 1471012075
jane smith 5 1471013449
jane smith 6 1471055903
joe blow 6 1473058839
jim jones 5 1471033691
我只对那些谁通过两种形式提交反馈用户感兴趣的(5,6)。我想过滤我的结果集,以便任何没有被淘汰的人和只被列出一次的人。 (例如,上面的结果集应该只显示john doe和jane smith,每次一个。)想法?
答
要仅为提交了反馈项目5和6的每个用户返回一行,您可以将您的2
表格加入两次,并对上述feedback
ID进行过滤。
SELECT 1.firstname, 1.lastname,
2a.feedback, 2a.timemodified,
2b.feedback, 2b.timemodified
FROM 1
INNER JOIN 2 as 2a ON 1.id = 2a.userid and 2a.feedback = 5
INNER JOIN 2 as 2b ON 1.id = 2b.userid and 2b.feedback = 6
ORDER BY 1.lastname
您还可以使用WHERE EXISTS
子句完成类似的结果。
SELECT 1.firstname, 1.lastname
FROM 1
WHERE
EXISTS (SELECT * FROM 2 WHERE 2.userid = 1.id and feedback = 5)
AND
EXISTS (SELECT * FROM 2 WHERE 2.userid = 1.id and feedback = 6)
注:我已经保存的1
和2
你极不寻常的表名在我的答案,以便回答问题比赛,但我怀疑这是你真正的表名。
+0
它们不是我真正的表名,但无论如何。查询工作。谢谢! – Chris
答
SELECT 1.firstname,
1.lastname
FROM 1
WHERE 1.id IN (SELECT 2.userid FROM 2)
对于表格/列标识符,1和2是不可接受的术语。 – Strawberry
如果您喜欢,请考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的CREATE和INSERT语句(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry