SQL:如何选择至少有N条评论的人?

时间:2015-03-11 20:07:26

标签: sql sqlite

我有一个简单的(我想)问题,令我感到困惑(我不是SQL专家,因为你很快就会看到......: - )。

我的表格person包含字段idname,表格comment包含字段idid_person和{{ 1}}:

text

评论与--------------- table: person --------------- id | name --------------- --------------------------- table: comment --------------------------- id | id_person | text --------------------------- =>上的人相关联person.id
每个人都可以有很多评论 我宁愿不在任何表格中保存评论数量。

问题是:如何选择至少有N条评论的所有人?

这就是我现在正在尝试的,但它当然是错误的......:

comment.id_person

P.S。:我目前正在使用sqlite,但标准的SQL答案很好......

3 个答案:

答案 0 :(得分:4)

我不确定我是否看到了您尝试过的内容有什么问题。你对ID进行了硬编码,但是如果你只是将它换掉,那就应该没问题了。

SELECT *
FROM person
WHERE (SELECT COUNT(*)
       FROM comment
       WHERE id_person = person.id) >= N

另一个解决方案,无论是否更好都很难知道(如果性能是一个问题,你应该尝试各自,或至少检查查询计划),将使用GROUP BY条款:

SELECT *
FROM person
WHERE id IN (SELECT id_person
             FROM comment
             GROUP BY id_person
             HAVING COUNT(*) >= N)

我喜欢在这里使用IN子句,与INNER JOIN相比,因为它可以让您SELECT *,就像您在示例中所做的那样。当然,这样做可以sometimes not be ideal,但听起来它适合您的情况。

当然,在每一项中,您都必须使用参数或字面值替换N

答案 1 :(得分:3)

最简单的方法是使用像这样的group byhaving子句

select p.name 
from   person p
       inner join comment c on c.id_person = p.id
group by
       p.name
having count(*) = 2

作为旁注:我会将您的列重命名为

---------------------------
table: person
---------------
 id_person | name
---------------

---------------------------
 table: comment
---------------------------
 id_comment | id_person | text
---------------------------

以明确哪些列彼此相关。有一天,你会遇到一个新的数据库架构,这些架构名称不匹配,你不得不求助于查找外键关系来解决问题。相信我,它并不好玩。

答案 2 :(得分:0)

DECLARE @N  INT--Here I declared variable N, but you could simply hardcode the value instead.
SELECT @N = 2

select  person.id,
        person.name 
from person 
INNER JOIN comment ON person.id = comment.id_person
GROUP BY person.id,
         person.name 
HAVING COUNT(comment.id) >= @N