【发布时间】:2013-11-30 10:34:42
【问题描述】:
如何对帖子进行排序,以便最近的活动排在最前面?
# 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;
我想按最近发布的帖子排序,其中新帖子显然比之前发布的帖子更新,但具有相关评论的旧帖子仍然符合条件。
第一次尝试
# 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
这不起作用,因为新帖子使用 cmets 排序在旧帖子之后。
第二次尝试
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
不起作用,因为如果帖子有多个评论,recency 将匹配第一行的 created 值,这是最旧的评论。
*有没有办法按p.id分组(所以每篇帖子只选择一份),但是每组内的排序是按c.date desc,但是查询顺序by 是近因吗?如果不向 post 添加一个 updated 字段,我想不出办法做到这一点,每当发布回复时我都会写信...... p>
谢谢!
【问题讨论】:
-
虽然没有保留,
comment是 MySQL 中公认的关键字,所以我会有点警惕将其用作表/列标识符
标签: mysql sql select sql-order-by