我正在创建留言板。当主题得到回复时,整个主题(具有topicid的所有行)必须碰到论坛的顶部。应始终首先显示固定主题,然后显示具有最新发布日期的主题,因为它们在得到回复时会被置于顶部。
这是包含帖子的表格的图片。
DB Table before query
我需要1个查询来执行以下操作:
查询应该给出以下结果
答案 0 :(得分:0)
我担心我只能回答你问题的部分内容,但我还是试了一下并发帖,希望它可以帮助你解决问题。
首先,我抓住固定消息(此查询中最新的消息):
SELECT * FROM messages WHERE pinned = 1 ORDER BY date DESC
然后,您可以抓住 - 让我们说 - 最近的10个主题:
SELECT MAX(date) AS latest, topicid FROM messages GROUP BY topicid ORDER BY latest DESC LIMIT 10
现在您应该知道要显示消息的topicid
。你可以把它们连在一起"带有连接的消息:
SELECT * FROM messages AS m1 JOIN messages AS m2 ON m1.postid = m2.parentid WHERE m1.topicid IN <some stuff here> ORDER BY m1.topicid ASC, m1.postid DESC
对不完整的答案表示歉意。欢迎任何评论来帮我填补空白;)
答案 1 :(得分:0)
我认为这个查询会做你想要的。
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)
订单的第一部分确保首先订购固定的组,然后是具有最新帖子的组。它通过选择固定组的最大可能日期来执行此操作,否则为该组中的帖子的最新日期,并按该值降序排序。然后第二部分按topicid对这些帖子进行排序,最后一部分由parentid排序。为了确保首先使用NULL parentid排序的帖子,我们在parentid上使用IFNULL子句在parentid为NULL时将排序值设置为0。
我已经创建了一个SQLFiddle来证明这一点。
修改此更新的查询还会按最新日期排序固定主题,而不是仅按主题排序。它通过在固定柱的日期增加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来演示。