需要帮助创建 1 个 MySQL 查询

法利斯

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

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

查询前的 DB 表
我需要 1 个查询来执行以下操作:

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

查询应给出以下结果

查询结果

缺口

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

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

需要帮助来创建单个Mysql查询

来自分类Dev

需要帮助的Mysql查询

来自分类Dev

需要帮助为我的 MYSQl 查询创建存储过程

来自分类Dev

MYSQL 查询包含 1 个查询中我需要的 2 个内容

来自分类Dev

需要MySQL查询优化帮助

来自分类Dev

需要帮助在 JOIN 查询之上创建一个只需要返回最新值的视图

来自分类Dev

使用1个查询和限制的3个MYSQL查询

来自分类Dev

Mysql:帮助从两个表查询

来自分类Dev

多个 mysql UPDATE 与 1 个查询

来自分类Dev

SQL - 需要帮助创建查询

来自分类Dev

mySQL - 需要帮助创建以不同方式引用多个表的查询

来自分类Dev

需要帮助拉起这个MySQL查询在PHP

来自分类Dev

需要帮助请使用mysql查询

来自分类Dev

需要帮助构建MySQL查询-动态数据

来自分类Dev

需要帮助来执行mysql查询

来自分类Dev

MySQL - 需要帮助提高查询性能

来自分类Dev

Express MySQL api需要帮助返回查询

来自分类Dev

Express MySQL api需要帮助返回查询

来自分类Dev

需要一个 MYSQL 查询

来自分类Dev

MySQL 将 2 个单独的查询合并为 1 个

来自分类Dev

MySQL 查询:3 个测试通过,1 个失败

来自分类Dev

我需要在 mysql 中创建一个具有动态值范围的查询

来自分类Dev

需要将2个查询合并为1个

来自分类Dev

需要帮助从数据示例创建SQL查询

来自分类Dev

MySQL查询-帮助从2个表中获取数据

来自分类Dev

MySQL将多个查询结果加入1个结果集

来自分类Dev

MySQL将多个查询结果加入1个结果集中

来自分类Dev

这可以在1个mysql查询中做吗

来自分类Dev

从MYSQL查询返回2个单独的列作为1列