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添加更新的字段,我想不出一种方法来做到这一点,每当发布回复时我都会写信给它...
谢谢!
这应该这样做:
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)
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |