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,每次一个。)想法?

+1

对于表格/列标识符,1和2是不可接受的术语。 – Strawberry

+0

如果您喜欢,请考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的CREATE和INSERT语句(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

要仅为提交了反馈项目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) 

注:我已经保存的12你极不寻常的表名在我的答案,以便回答问题比赛,但我怀疑这是你真正的表名。

+0

它们不是我真正的表名,但无论如何。查询工作。谢谢! – Chris

SELECT 1.firstname, 
     1.lastname 
FROM 1 
WHERE 1.id IN (SELECT 2.userid FROM 2)