mysql中limit影响查询结果的排序

zz 发表于: 2021-09-14   最后更新时间: 2021-09-14 22:36:02   2,327 游览

在一段查询中加上 limit 之后查询的结果顺序发生了变化

表的结构和查询语句如下

drop table if exists user;
drop table if exists grade_info;

CREATE TABLE user (
id  int(4) NOT NULL,
name varchar(32) NOT NULL
);

CREATE TABLE grade_info (
user_id  int(4) NOT NULL,
grade_num int(4) NOT NULL,
type varchar(32) NOT NULL
);

INSERT INTO user VALUES
(1,'tm'),
(2,'wwy'),
(3,'zk'),
(4,'qq'),
(5,'lm');

INSERT INTO grade_info VALUES
(1,3,'add'),
(2,3,'add'),
(1,1,'reduce'),
(3,3,'add'),
(4,3,'add'),
(5,3,'add'),
(3,1,'reduce');
SELECT
 user_id,
 u.name,
 SUM(CASE
  WHEN type = "reduce" THEN
  - grade_num ELSE grade_num 
 END ) grade
FROM
 grade_info g,user u
 WHERE g.user_id=u.id
 GROUP BY u.id,u.name
 ORDER BY grade DESC

不加limit的查询结果

user_id   name   grade
2         wwy    3
4         qq     3
5         lm     3
1         tm     2
3         zk     2

加limit 3的查询结果

user_id   name   grade
2         wwy    3
5         lm    3
4         qq    3

加limit 2的查询结果

user_id   name   grade
5         lm    3
2         wwy    3

可以看到原本默认按照序号排序的查询结果变成了不规则乱序,希望知道的乱序的原因和解决方案

发表于 2021-09-14
zz
添加评论

如果没有指定ORDER BY语句,则SQL Server(或任何RDBMS)不保证以特定顺序返回结果。

查询处理期间可以改变行顺序的许多因素,例如并行的HASH连接是更改行顺序的操作符的一个很好的例子。

如果指定ORDER BY语句,SQL Server将对行进行排序,并按请求的顺序返回。

但是,如果该顺序不是确定性的,就是有重复的值,则在每个具有相同值的组中,由于与上述相同的原因,该顺序是“随机的”。

所以,确保确定性顺序的唯一方法是在ORDER BY子句中包含保证的唯一列或列组(例如主键)。

zz -> 半兽人 3年前

可是limit 4和limit 5的顺序是一样的,limit 2 和 1的顺序是一样的,limit 3又是另外一个顺序

你的答案

查看mysql相关的其他问题或提一个您自己的问题