mysql - 分组分页日期数据

标签 mysql sql group-by pagination sql-order-by

我有一个看起来像这样的表:

create (DATETIME) |   Message (TEXT)
=========================================
2013-08-05 9:00:00  "Hi there!"
2013-08-05 10:00:00 "Hi again!"
2013-08-07 14:00:00 "Hi from the future!"

我希望能够在 DATE(create) 获取所有消息并分组,以便消息按 2013-08-052013 分组-08-07 等等。这可以通过 ORDER BY 轻松完成:

SELECT * FROM messages ORDER BY create

问题是我希望能够按组分页。例如,如果我有 10 个不同的日期,我想每页显示 5 个日期组的所有消息并分页。

我见过很多LIMIT组内元素数量的解决方案,但还没有看到任何LIMIT组数量的解决方案。

我基本上想要这样的结果:

如果LIMIT只显示一组:

2013-08-05 9:00:00  "Hi there!"
2013-08-05 10:00:00 "Hi again!"

如果LIMIT显示 2 个组:

2013-08-05 9:00:00  "Hi there!"
2013-08-05 10:00:00 "Hi again!"
2013-08-07 14:00:00 "Hi from the future!"

如果 LIMIT 显示 1 组跳过第一个:

2013-08-07 14:00:00 "Hi from the future!"

如何在 SQL 中实现这一点?

最佳答案

示例数据更清楚:)

查询 #1:1 组从 0 开始计数

SELECT m1.* FROM messages m1 JOIN (
  SELECT DISTINCT date(created) OnlyDate FROM messages
  ORDER BY OnlyDate
  LIMIT 0,1
) m2 ON date(m1.created) = OnlyDate;

|             CREATED |   MESSAGE |
|---------------------|-----------|
|  2013-08-05 9:00:00 | Hi there! |
| 2013-08-05 10:00:00 | Hi again! |

查询 #2:1 组从 1 开始

SELECT m1.* FROM messages m1 JOIN (
  SELECT DISTINCT date(created) OnlyDate FROM messages
  ORDER BY OnlyDate
  LIMIT 1,1
) m2 ON date(m1.created) = OnlyDate

|             CREATED |             MESSAGE |
|---------------------|---------------------|
| 2013-08-07 14:00:00 | Hi from the future! |

您只需使用 limit 子句处理组(第一个值是起始组,第二个值是它的偏移量)。查询也应该非常高效,并且不难阅读。

fiddle here .

关于mysql - 分组分页日期数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564301/

相关文章:

sql - 编写查询以从集合中获取最新项目的最有效方法是什么?

sql - 返回团队成员多次被召回的日期

php - 显示来自连接的数据?

python - Pandas 分组行值调整

mysql - 是否可以在一个表中创建两个主键?

php - mysql 开放时间超过午夜

php - 使用 jQuery ajax 显示输出后,使用 PHP post 方法该值不会传递

php - 使用 MySQL 数据库和 PHP 进行搜索

mysql - 如何在 MySQL 中使用聚合和 UNION 解决此问题?

mysql - 选择两个表的用户数