我认为这个查询会做你想做的。
SELECT *
FROM messages m
ORDER BY IF(pinned='yes','9999-12-31 23:59:59', (SELECT MAX(date) FROM messages m2 WHERE m2.topicid = m.topicid)) DESC,
topicid, IFNULL(parentid, 0)
order by 的第一部分确保首先对固定的组进行排序,然后是具有最新帖子的组。它通过选择固定组的最大可能日期来实现,否则选择该组中帖子的最新日期并按该值降序排序。然后第二部分按 topicid 对这些帖子进行排序,最后一部分按 parentid 排序。为了确保具有 NULL parentid 的帖子首先排序,我们在 parentid 上使用 IFNULL 子句,当 parentid 为 NULL 时将排序值设置为 0。
我创建了一个SQLFiddle来演示这一点。
编辑此更新的查询还将按最新日期而不是仅按 topicid 对固定主题进行排序。它通过在固定帖子的日期上增加 1000 年来实现这一点,从而确保固定帖子排在非固定帖子之前,同时保持固定帖子之间的顺序。
SELECT *
FROM messages m
ORDER BY (SELECT MAX(IF(pinned='yes', date + interval 1000 year, date))
FROM messages m2
WHERE m2.topicid = m.topicid) DESC,
topicid, ifnull(parentid, 0)
这是一个更新的SQLFiddle来演示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句