构造SQL查询以查找所有具有相同值的记录

时间:2015-02-04 19:20:22

标签: mysql sql subquery nested-queries

我有一张与一个人的评论相关的表格。该表格包含以下字段: reviewId personId isComplete ,其中 isComplete 是一个布尔值,表示是否具体那个人完成了他的评论。

想象一下以下值:

ReviewID | PersonID | isComplete |

   1         1         1
   2         1         1
   3         2         0
   4         2         0
   5         3         1
   6         3         0

在这种情况下,我应该只得到 PersonID = 1,因为只有他们完成了所有的评论。 我尝试了很多查询,最接近的是: SELECT * FROM reviews x WHERE 1 = ALL (SELECT isComplete FROM reviews y WHERE x.personid = y.personid AND isComplete=1);

非常感谢任何建议或提示。

3 个答案:

答案 0 :(得分:2)

  • 表A包含所有记录
  • 表B包含至少有一次未完成审核的所有人。
  • 我们使用左连接并消除空值,以便剩下的只是那些记录没有未完成评论的用户......

SELECT Distinct A.PersonID 
FROM TABLE A
LEFT JOIN Table B 
 on A.PersonID = B.PersonId
 and B.isComplete = 0
WHERE B.PersonId is null

我使用distinct只返回1条记录。

另一种方法(我认为最有效)是使用存在语句

SELECT Distinct A.PersonID
FROM table A
WHERE not exists (Select 1 from Table B where B.iscomplete=0 and A.PersonID=B.PersonID)

这基本上说明了所有没有完整评论的人。

这两种情况的前提是,单个条目的不完整审核足以将其从结果集中排除。

答案 1 :(得分:1)

SELECT DISTINCT(PersonID) FROM reviews 
WHERE PersonId NOT IN (
    SELECT DISTINCT(PersonID) FROM reviews WHERE isComplete = 0
)

答案 2 :(得分:1)

有多种方法可以做到这一点。

SELECT * FROM reviews a WHERE a.PersonId NOT IN
( SELECT b.PersonId FROM reviews b WHERE b.isComplete = 0 )

这是让所有匹配isComplete = 0的人,然后只包括不在该列表中的人。