【问题标题】:MySQL order posts by most recent comment OR last posted最近评论或最后发布的 MySQL 订单帖子
【发布时间】: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


【解决方案1】:

应该这样做:

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

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

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

【讨论】:

  • 某种作品,但顺序相反 - 通过在该查询末尾添加 DESC 来解决。尽管如此,还是不​​太管用。
  • 美丽。谢谢!我不熟悉 COALESCE 功能。再次感谢!!
  • 这非常适合我的确切情况。太感谢了!今晚我学到了一些新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多