MySQL按最新评论或最后发布的帖子排序

rod*_*ira 3 mysql sql select sql-order-by

如何对帖子进行排序,以便将最近的活动排在最前面?

# Schema not including all info, including FKs
CREATE TABLE post(
   id int unsigned primary key auto_increment,
   msg text,
   created datetime
)ENGINE=InnoDb;

CREATE TABLE comment(
   id int unsigned primary key auto_increment,
   post_id int unsigned,
   msg text,
   created datetime
)ENGINE=InnoDb;
Run Code Online (Sandbox Code Playgroud)

我想按最近的顺序排序帖子,其中新帖子显然比以前发布的帖子更新,但带有最近评论的旧帖子仍属于最近的帖子。

第一次尝试

# Selecting '*' for simplicity in this example
select *
from post p
left join comment c on c.post_id = p.id
group by p.id
order by c.created desc, p.created desc
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为新帖子在带有评论的旧帖子之后排序。

第二次尝试

select *, if(c.id is null, p.created, c.created) as recency
from post p
left join comment c on c.post_id = p.id
group by p.id
order by recency desc
Run Code Online (Sandbox Code Playgroud)

不起作用,因为如果帖子有多个评论,新近度将匹配第一行的创建值,这是最旧的评论。

*有没有办法按 p.id 分组(所以只选择每个帖子的一个副本),但每个组内的排序是按 c.date desc,但查询 order by 是按新近度完成的?如果不向post添加更新的字段,我想不出一种方法来做到这一点,每当发布回复时我都会写信给它...

谢谢!

Pau*_*per 6

这应该这样做:

SELECT p.id
FROM post p
    LEFT JOIN comment c on c.post_id = p.id
GROUP BY p.id
ORDER BY COALESCE(GREATEST(p.created, MAX(c.created)), p.created) DESC
Run Code Online (Sandbox Code Playgroud)

如果我们假设评论总是比帖子早,我们可以简化:

SELECT p.id
FROM post p
    LEFT JOIN comment c on c.post_id = p.id
GROUP BY p.id
ORDER BY COALESCE(MAX(c.created), p.created) DESC
Run Code Online (Sandbox Code Playgroud)