我有一个简单的(我想)问题,令我感到困惑(我不是SQL专家,因为你很快就会看到......: - )。
我的表格person
包含字段id
和name
,表格comment
包含字段id
,id_person
和{{ 1}}:
text
评论与---------------
table: person
---------------
id | name
---------------
---------------------------
table: comment
---------------------------
id | id_person | text
---------------------------
=>上的人相关联person.id
。
每个人都可以有很多评论
我宁愿不在任何表格中保存评论数量。
问题是:如何选择至少有N条评论的所有人?
这就是我现在正在尝试的,但它当然是错误的......:
comment.id_person
P.S。:我目前正在使用sqlite,但标准的SQL答案很好......
答案 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 by
和having
子句
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