MySQL限制1返回订单结果集的最后一条记录?

时间:2015-10-13 10:07:26

标签: 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 |   10 |
+---+------+
  1. 当我选择表时,请使用此查询

    按b限制1从排序顺序中选择*;

  2. 结果集就是这个

    +---+------+
    | a | b    |
    +---+------+
    | 3 |   10 |
    +---+------+
    

    这不是我排除的(我认为返回第一条记录是合理的)。

    我的mysql版本是Ver 14.14 Distrib 5.6.23,for osx10.8(x86_64)

    能解释一下吗?感谢。

3 个答案:

答案 0 :(得分:0)

因为当您输入select * from sort order by b;时,这将加载ACS的隐藏字段。这意味着查询使用升序加载所有日期。

+---+------+
| a |   b  |
+---+------+
| 1 |  10  |
| 2 |  10  |
| 3 |  10  |
+---+------+

但如果您使用select * from sort order by b limit 1;,则会再次使用ACS加载数据,然后您的条件为LIMIT 1。因此,在b列中,所有内容均为10,因此它将加载该值的最后添加值。

  

Bz MySQL将决定最后添加的行是最新的

答案 1 :(得分:0)

此SQL Server已经返回了合理的记录。 因为,您按具有相同数量的列进行排序(按服务评估)。

SQL Server的步骤是::

    检查它是否已编入索引 - >从磁盘/索引读取表 - >排序数据 - >获取n个已排序的数据。

(你的查询中的n)

因此,这个SQL Server将从磁盘(存储)返回它在主表中找到的第一个,因为你没有索引它。



除非你通过a,b订购。
你的结果会得到1,10。

或者创建一个使数据顺序不同的索引。 (你也可以得到2,10)
否则,您将获得第一个插入数据到磁盘的结果。

答案 2 :(得分:0)

我实际上无法解释这种行为,因为我无法复制它。但是我可以证明OP的预期是我的mysql(Ver 14.14 Distrib 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 |
+---+------+

这是一个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声称的内容,但我不能让它发生。