【问题标题】:Need help creating 1 MySQL query需要帮助创建 1 个 MySQL 查询
【发布时间】:2018-05-13 20:59:19
【问题描述】:

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

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

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

  1. 将所有topicid组合在一起(我们称之为“组”);
  2. 在每个组内,按 parentid 升序对行进行排序,但始终先排序 NULL;
  3. 首先显示“固定”的组
  4. 然后首先显示“最新”帖子的组

查询应该给出以下结果

Results of the query

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我认为这个查询会做你想做的事。

    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 排序。为确保 parentid 为 NULL 的帖子优先排序,我们在 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 来演示。

    【讨论】:

    • 一点也不差!但我也想对“最新”帖子上的固定主题进行排序。因此,在所有固定主题中,我想首先显示具有最新帖子的主题。在您的查询中,所有固定主题都有最新帖子“9999-12-31 23:59:59”,因此查询仅按主题 ID 对固定主题进行排序。
    • 嗨@Farliesz,看看我的编辑。这个新查询也将保留固定帖子的顺序。
    • 完美!谢谢!
    【解决方案2】:

    恐怕我只能回答你的部分问题,但我还是试了一下并发布它,希望它能帮助你解决问题。

    首先,我会抓取固定的消息(此查询中最新的在前):

    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
    

    现在您应该知道要从中显示消息的topicids。您可以通过连接将消息“链接在一起”:

    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
    

    抱歉,答案不完整。欢迎任何帮助我填补空白的 cmets ;)

    【讨论】:

    • 感谢您的回复。我可以用多个查询来做到这一点,但我想知道我是否可以只用 1 个查询来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多