我想,我需要构建一些相当简单的SQL,但是因为这是我与DB合作的一个罕见事件,所以我无法弄清楚细节。
我有一个表'posts',其中包含以下列:
id,标题,文字
以及包含以下列的表'comments':
id,name,text,post_id
(单个)SQL语句通过'post_id'键检索具有与之关联的一个或多个注释的所有帖子的标题是什么样的?如果DBMS与SQL查询有任何关联,则DBMS是MySQL。
答案 0 :(得分:7)
select p.caption, count(c.id) from posts p join comments c on p.id = c.post_id group by p.caption having count (c.id) > 0
答案 1 :(得分:2)
SELECT DISTINCT p.caption, p.id
FROM posts p,
comments c
WHERE c.post_ID = p.ID
我认为使用连接比使用IN子句或子查询要快得多。
答案 2 :(得分:0)
SELECT标题FROM帖子 INNER JOIN评论评论.post_id = posts.id GROUP BY posts.id;
无需有条款或计数()。
编辑:当然应该是一个内部连接(如果评论是孤立的,则避免空值),感谢jishi。
答案 3 :(得分:0)
SELECT DISTINCT caption
FROM posts
INNER JOIN comments ON posts.id = comments.post_id
忘记计数和子查询。
内部联接将获取所有包含有效帖子的评论,并排除所有包含0条评论的帖子。 DISTINCT将合并具有多于1条评论的帖子的重复字幕条目。
答案 4 :(得分:0)
我认为这种语法在这种情况下最具可读性:
SELECT * FROM posts P
WHERE EXISTS (SELECT * FROM Comments WHERE post_id = P.id)
它比这个帖子中的大多数其他人更好地表达了你的意图 - “给我所有帖子......”(从帖子中选择*)“......有任何评论”(如果存在的话)(从评论中选择*) ......))。它与上面的连接基本相同,但是因为你实际上并没有进行连接,所以你不必担心在帖子中获得重复的记录,所以你只需要为每个帖子获得一条记录。
答案 5 :(得分:-1)
刚刚离开我的头顶,但可能是这样的:
SELECT caption FROM posts WHERE id IN (SELECT post_id FROM comments HAVING count(*) > 0)
答案 6 :(得分:-2)
你基本上是在寻找子查询 -
SELECT p.caption FROM posts p WHERE (SELECT COUNT(*) FROM comments c WHERE c.post_id=p.id) > 1;
这具有为posts表中的每一行运行SELECT COUNT(*)
子查询的效果。根据表的大小,您可以考虑在comment_count
表中添加一个额外的列posts
,以存储相应的comments
的数量,这样您就可以} p>
SELECT p.caption FROM posts p WHERE comment_count > 1