MySQL limit 1返回order by?的结果集的最后一条记录?
1.我创建了一个表MySQL limit 1返回order by?的结果集的最后一条记录?,mysql,limit,Mysql,Limit,1.我创建了一个表 create table sort ( a int, b int, primary key (a)); 2.然后我插入了三条记录 insert into sort values(1, 10), (2, 10), (3, 10); 3.当我选择使用此sql时 select * from sort order by b; 结果是这样的 +---+------+ | a | b | +---+------+ | 1 | 10 | | 2 | 10 | | 3
create table sort (
a int,
b int,
primary key (a));
2.然后我插入了三条记录
insert into sort values(1, 10), (2, 10), (3, 10);
3.当我选择使用此sql时
select * from sort order by b;
结果是这样的
+---+------+
| a | b |
+---+------+
| 1 | 10 |
| 2 | 10 |
| 3 | 10 |
+---+------+
+---+------+
| a | b |
+---+------+
| 3 | 10 |
+---+------+
这并不是我所期望的(我认为第一次记录的回报是合理的)
我的mysql版本是14.14发行版5.6.23,适用于osx10.8(x86_64)
有人能给我解释一下吗?谢谢。这是因为当您键入
时,按b从排序顺序中选择*代码>这将加载ACS
的隐藏字段。这意味着查询以升序加载所有日期
+---+------+
| a | b |
+---+------+
| 1 | 10 |
| 2 | 10 |
| 3 | 10 |
+---+------+
但如果使用从排序顺序中选择*按b限制1代码>它再次使用ACS
加载数据,然后您就有了限制1
的条件。所以在b
列中,所有的值都是10
,所以它将加载该值的最后一个附加值
BzMySQL
将决定最后添加的行是最新的行
此SQL Server已返回合理的记录。
因为,您可以按数量相同的列进行订购(按服务评估)
SQL Server执行的步骤是:
检查是否有索引->从磁盘读取表/索引->排序数据->获取n个排序数据。
(来自您的查询)
因此,此SQL Server将从磁盘(存储)返回它在主表中找到的第一个SQL Server,因为您尚未对其编制索引
除非你点的是a,b。
您将得到1,10作为结果。
或者创建一个使数据顺序不同的索引。(你也可以得到2,10作为结果)
否则,您将获得第一个插入磁盘的数据作为结果。我无法实际解释该行为,因为我无法复制它。但我可以证明OP所期望的是我的mysql(版本14.14发行版5.5.44,适用于debian linux gnu(i686))的工作方式[NB,我以不同的顺序插入记录,以证明一点):
首先,如果没有主键:
mysql> create table sort (
-> a int,
-> b int);
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+------+------+
| a | b |
+------+------+
| 3 | 10 |
+------+------+
mysql> create table sort (
-> a int,
-> b int,
-> primary key (a));
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+---+------+
| a | b |
+---+------+
| 1 | 10 |
+---+------+
将显示第一条插入的记录
并使用主键:
mysql> create table sort (
-> a int,
-> b int);
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+------+------+
| a | b |
+------+------+
| 3 | 10 |
+------+------+
mysql> create table sort (
-> a int,
-> b int,
-> primary key (a));
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+---+------+
| a | b |
+---+------+
| 1 | 10 |
+---+------+
这是一个myisam表(在我的服务器上是默认的),因此该表有一个聚集索引,这会导致该表按a列的顺序读取。因此,a=1是第一条记录(我相信)
最后,使用innodb:
mysql> create table sort ( a int, b int, primary key (a) ) engine=myisam;
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+---+------+
| a | b |
+---+------+
| 3 | 10 |
+---+------+
没有聚集索引,因此返回输入的第一条记录
所有这些都不能解释OP声称的内容,但我不能让它发生。为什么它要返回第一个?您是按列“B”排序的,列“A”是不相关的,MySQL将数据存储在文件中的方式与您在GUI中看到的不同,它对表进行排序并获取具有最低“B”值的列,是否有具有较低“B”值的行B’?不,这意味着查询是正确的,如果您希望返回第一行,那么按B添加order,aInteresting。我尝试了它(使用innodb和myisam,以防产生差异),得到了第一行(a=1)作为结果,限制为1(如您所料)@ogres补充道,作为回答,这仍然不是一个解释。当然,mysql返回3行中的任何一行都没有错,但我个人更喜欢对行为进行实际解释。我试图复制它,但我不能。你认为innodb表的主键不是聚集索引吗myisam表的ry键不是聚集索引。这就是myisam和innodb示例不同的原因(我认为)。