我正在编写sql查询以获取帖子,并且只对此帖子的最后评论(如果存在)。 但我找不到一种方法来限制左连接中右列的1行。
以下是此查询的示例。
SELECT post.id, post.title,comment.id,comment.message
from post
left outer join comment
on post.id=comment.post_id
如果帖子有3条评论,我会在这篇帖子中获得3行,但我只想要1行和最后评论(按日期排序)。
有人可以帮我解决这个问题吗?
答案 0 :(得分:51)
SELECT post.id, post.title, comment.id, comment.message
FROM post
OUTER APPLY
(
SELECT TOP 1 *
FROM comment с
WHERE c.post_id = post.id
ORDER BY
date DESC
) comment
或
SELECT *
FROM (
SELECT post.id, post.title, comment.id, comment.message,
ROW_NUMBER() OVER (PARTITION BY post.id ORDER BY comment.date DESC) AS rn
FROM post
LEFT JOIN
comment
ON comment.post_id = post.id
) q
WHERE rn = 1
前者对于几个帖子来说效率更高,每个帖子都有很多评论;后者对于很多帖子来说效率更高,每个帖子的评论都很少。
答案 1 :(得分:14)
子查询:
SELECT p.id, p.title, c.id, c.message
FROM post p
LEFT join comment c
ON c.post_id = p.id AND c.id =
(SELECT MAX(c.id) FROM comment c2 WHERE c2.post_id = p.id)
答案 2 :(得分:3)
您需要加入一个返回帖子最后评论的子查询。例如:
select post.id, post.title. lastpostid, lastcommentmessage
from post
inner join
(
select post.id as lastpostid, max(comment.id) as lastcommentmessage
from post
inner join comment on commment.post_id = post.id
group by post.id
) lastcomment
on lastpostid = post.id
答案 3 :(得分:1)
几个选项......
一种方法是在JOIN上进行:
SELECT TOP 1 comment.message FROM comment ORDER BY comment.id DESC
(注意我假设comment.id是一个身份字段)
答案 4 :(得分:1)
什么版本的SQL Server?如果您有Row_Number()函数可用,您可以按照“第一”的方式对您的注释进行排序,然后只需添加“where RN = 1”子句。没有一个方便的示例或正确的语法,但确实有大量的查询正是这样做的。其他帖子都是以1,000种方式完成的。
我会说出来,看看哪一个最适合你。
答案 5 :(得分:0)
您没有说出日期字段的具体名称,因此我填写了[DateCreated]
。这与上面的AGoodDisplayName的帖子基本相同,但是使用日期字段而不是依赖于ID列排序。
SELECT post.id, post.title, comment.id, comment.message
FROM post p
LEFT OUTER JOIN comment
ON comment.id = (
SELECT TOP 1 id
FROM comment
WHERE p.id = post_id
ORDER BY [DateCreated] ASC
)