Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL limit 1返回order by?的结果集的最后一条记录?_Mysql_Limit - Fatal编程技术网

MySQL limit 1返回order by?的结果集的最后一条记录?

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

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 |
+---+------+
  • 选择表时,请使用此查询

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

  • 结果集是这样的

    +---+------+
    | 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
    ,所以它将加载该值的最后一个附加值

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


    此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示例不同的原因(我认为)。