【发布时间】:2010-09-22 06:20:57
【问题描述】:
我想我需要构建一些相当简单的 SQL,但由于这些天我很少使用 DB,所以我无法弄清楚细节。
我有一个包含以下列的“帖子”表:
id、标题、文字
还有一个包含以下列的“cmets”表:
id、姓名、文本、post_id
(单个)SQL 语句会是什么样子,它通过“post_id”键检索与一个或多个 cmets 关联的所有帖子的标题?如果 DBMS 与 SQL 查询有任何相关性,那么它就是 MySQL。
【问题讨论】:
我想我需要构建一些相当简单的 SQL,但由于这些天我很少使用 DB,所以我无法弄清楚细节。
我有一个包含以下列的“帖子”表:
id、标题、文字
还有一个包含以下列的“cmets”表:
id、姓名、文本、post_id
(单个)SQL 语句会是什么样子,它通过“post_id”键检索与一个或多个 cmets 关联的所有帖子的标题?如果 DBMS 与 SQL 查询有任何相关性,那么它就是 MySQL。
【问题讨论】:
选择 p.caption, count(c.id) 从帖子 p 加入 cmets c on p.id = c.post_id 按 p.caption 分组 计数 (c.id) > 0
【讨论】:
SELECT DISTINCT p.caption, p.id
FROM posts p,
comments c
WHERE c.post_ID = p.ID
我认为使用连接会比使用 IN 子句或子查询快很多。
【讨论】:
SELECT DISTINCT caption
FROM posts
INNER JOIN comments ON posts.id = comments.post_id
忘记计数和子查询。
inner join 会挑选出所有有效帖子的 cmets,并排除所有 cmets 为 0 的帖子。 DISTINCT 将合并具有超过 1 条评论的帖子的重复标题条目。
【讨论】:
我发现这种语法在这种情况下是最易读的:
SELECT * FROM posts P
WHERE EXISTS (SELECT * FROM Comments WHERE post_id = P.id)
它比此线程中的大多数其他人更好地表达了您的意图 - “给我所有的帖子......”(从帖子中选择 *)“......有任何 cmets”(如果存在(从 cmets 中选择 * ...))。它与上面的联接基本相同,但由于您实际上并没有进行联接,因此您不必担心在 Posts 中获得重复记录,因此每个帖子只会获得一条记录。
【讨论】:
SELECT caption FROM posts
INNER JOIN comments ON comments.post_id = posts.id
GROUP BY posts.id;
不需要having 子句或count()。
编辑:当然应该是inner join(如果评论是孤立的,以避免空值),感谢 jishi。
【讨论】:
我只是想在这里,但可能是这样的:
SELECT caption FROM posts WHERE id IN (SELECT post_id FROM comments HAVING count(*) > 0)
【讨论】:
您基本上是在查看执行子查询 --
SELECT p.caption FROM posts p WHERE (SELECT COUNT(*) FROM comments c WHERE c.post_id=p.id) > 1;
这具有为帖子表中的每一行运行SELECT COUNT(*) 子查询的效果。根据表的大小,您可以考虑在posts 表中添加一个额外的列comment_count 来存储对应的comments 的数量,这样您就可以简单地做
SELECT p.caption FROM posts p WHERE comment_count > 1
【讨论】: