我有一个看起来像这样的表:
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-05
、2013 分组-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/