SQL:根据两个列值过滤结果集中的重复项

时间:2016-08-23 16:02:51

标签: mysql sql

我有一个网站,收集两种表格的反馈。我有一个SQL查询,它返回通过其中一个或两个提交反馈的用户的名称。反馈表格在表格的feedback栏中给出了ID 5和6。

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

我只对那些通过BOTH表单(5和6)提交反馈的用户感兴趣。我想过滤我的结果集,以便任何没有被淘汰的人和那些只被列出一次的人。 (例如,上面的结果集应该只显示john doe和jane smith,每次一次。)想法?

2 个答案:

答案 0 :(得分:1)

要仅为已提交反馈项目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的极不寻常的表名,以便答案与问题相符,但我怀疑这些是您真正的表名。< / p>

答案 1 :(得分:0)

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