Mysql 使用多个 ORDER BY 进行分页
Mysql Paging With multiple ORDER BY
我在使用 mysql 寻呼机时遇到一些问题。
- 计数所有行是 164。
- pro_type - 可以是 3 个不同的整数值;
- pro - 整数值;
- cr_date - 某个日期。
这是我的查询:
SELECT id FROM table WHERE f1='1' AND f2='0' AND uid=43 ORDER BY pro_type DESC, pro DESC, cr_date DESC LIMIT 100;
SELECT id FROM table WHERE f1='1' AND f2='0' AND uid=43 ORDER BY pro_type DESC, pro DESC, cr_date DESC LIMIT 100 OFFSET 100;
- 第二个查询结果与第一个查询结果有重复的行。
- 两个结果都不包含一行或几行。
- 第一个查询的行数是100,第二个是64,所以结果数是可以的。
- 查询限制为 200 return 所有有效行(164 行不重复)。
也许有人知道,在那种情况下 ORDER BY & LIMIT OFFSET 有什么问题?
谢谢。
基本上,可能发生的情况是数据具有 pro_type, pro, cr_date
的重复值。当您使用 order by
并且键相同时,MySQL 不保证具有相同键值的结果的顺序。也就是说排序不是"stable".
假设 id
是唯一的,解决方案是将它添加到 order by
子句中,以便排序键是唯一的:
ORDER BY pro_type DESC, pro DESC, cr_date DESC, ID
------------------------------------------------^
LIMIT 100;
我在使用 mysql 寻呼机时遇到一些问题。
- 计数所有行是 164。
- pro_type - 可以是 3 个不同的整数值;
- pro - 整数值;
- cr_date - 某个日期。
这是我的查询:
SELECT id FROM table WHERE f1='1' AND f2='0' AND uid=43 ORDER BY pro_type DESC, pro DESC, cr_date DESC LIMIT 100;
SELECT id FROM table WHERE f1='1' AND f2='0' AND uid=43 ORDER BY pro_type DESC, pro DESC, cr_date DESC LIMIT 100 OFFSET 100;
- 第二个查询结果与第一个查询结果有重复的行。
- 两个结果都不包含一行或几行。
- 第一个查询的行数是100,第二个是64,所以结果数是可以的。
- 查询限制为 200 return 所有有效行(164 行不重复)。
也许有人知道,在那种情况下 ORDER BY & LIMIT OFFSET 有什么问题?
谢谢。
基本上,可能发生的情况是数据具有 pro_type, pro, cr_date
的重复值。当您使用 order by
并且键相同时,MySQL 不保证具有相同键值的结果的顺序。也就是说排序不是"stable".
假设 id
是唯一的,解决方案是将它添加到 order by
子句中,以便排序键是唯一的:
ORDER BY pro_type DESC, pro DESC, cr_date DESC, ID
------------------------------------------------^
LIMIT 100;