需要帮助创建1个MySQL查询

时间:2018-05-13 20:59:19

标签: mysql

我正在创建留言板。当主题得到回复时,整个主题(具有topicid的所有行)必须碰到论坛的顶部。应始终首先显示固定主题,然后显示具有最新发布日期的主题,因为它们在得到回复时会被置于顶部。

这是包含帖子的表格的图片。

DB Table before query
我需要1个查询来执行以下操作:

  1. 将所有主题组合在一起(让我们称之为“组”);
  2. 每个组中的
  3. 按parentid升序对行进行排序,但NULL总是先排序;
  4. 首先显示“固定”的组
  5. 然后首先显示“最新”帖子的小组
  6. 查询应该给出以下结果

    Results of the query

2 个答案:

答案 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来演示。