Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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如何处理查询中的ORDER BY和LIMIT?_Mysql_Sql_Sql Order By_Sql Limit - Fatal编程技术网

MySQL如何处理查询中的ORDER BY和LIMIT?

MySQL如何处理查询中的ORDER BY和LIMIT?,mysql,sql,sql-order-by,sql-limit,Mysql,Sql,Sql Order By,Sql Limit,我有一个如下的查询: 按发布日期限制从表1中选择文章20 如何按工作排序?它将对所有记录进行排序,然后获得前20条记录,还是将获得20条记录并按publish\u date字段进行排序 如果它是最后一个,你不能保证真的得到最近的20篇文章。它会先订购,然后得到前20篇。数据库还将处理WHERE子句中orderby之前的任何内容。LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数值参数,这两个参数都必须是非负整数常量(使用准备语句时除外) 对于两个参数,第一个参数指定要

我有一个如下的查询:

按发布日期限制从表1中选择文章20

如何按工作排序?它将对所有记录进行排序,然后获得前20条记录,还是将获得20条记录并按
publish\u date
字段进行排序


如果它是最后一个,你不能保证真的得到最近的20篇文章。

它会先订购,然后得到前20篇。数据库还将处理
WHERE
子句中
orderby

之前的任何内容。LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数值参数,这两个参数都必须是非负整数常量(使用准备语句时除外)

对于两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为0(不是1):

从tbl限制5,10中选择*检索第6-15行

要检索从某个偏移量到结果集末尾的所有行,可以对第二个参数使用一些较大的数字。此语句检索从第96行到最后一行的所有行:

从tbl限额9518446744073709551615中选择*

通过一个参数,该值指定从结果集开始返回的行数:

从tbl限制5中选择*检索前5行

换句话说,限制行数等于限制0,行数


有关的所有详细信息:

限制通常作为最后一个操作应用,因此将首先对结果进行排序,然后限制为20。事实上,只要找到前20个排序结果,排序就会停止。

如果有合适的索引,在这种情况下,在
publish\u date
字段上,MySQL不需要扫描整个索引以获得请求的20条记录-20条记录将在索引的开始处找到。但如果没有合适的索引,则需要对表进行完整扫描


有一个从2009年开始的记录。

您可以在订单末尾添加[asc]或[desc],以获取最早或最新的记录

例如,这将首先为您提供最新的记录

ORDER BY stamp DESC
LIMIT
子句附加在
orderby

之后,您可以使用此代码
按发布日期限制0,10从表1中选择文章

其中0是记录的开始限制&10条记录的数量

正如@James所说,它将对所有记录进行排序,然后获得前20行

既然如此,你保证会得到20篇第一次发表的文章,更新的文章将不会显示

在您的情况下,我建议您将
desc
添加到
orderbypublish\u date
,如果您想要最新的文章,那么最新的文章将排在第一位

如果您需要保持结果的升序,并且仍然只需要10篇最新文章,那么您可以让mysql对结果进行两次排序

下面的查询将按降序对结果进行排序,并将结果限制为10(即括号内的查询)。它仍将按降序排序,我们对此并不满意,因此我们要求mysql再次对其进行排序。现在我们有最后一行的最新结果

select t.article 
from 
    (select article, publish_date 
     from table1
     order by publish_date desc limit 10) t 

order by t.publish_date asc;
如果需要所有列,请按以下方式完成:

select t.* 
from 
    (select * 
     from table1  
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

当我手动编写查询以检查数据库中的各种内容时,我使用这种技术。我没有在生产环境中使用过它,但现在当我对它进行台架标记时,额外的排序不会影响性能。

可以简化为:

按发布日期描述从表1中选择文章,仅获取前20行


您还可以在按发布日期排序的
中添加许多参数,如:
按发布日期排序、tab2、tab3 DESC
等。

欢迎使用stackoverflow。我想你可能误解了这个问题。我相信他们问的是操作顺序,而不是“如何排序”。(但这是没有意义的,因为这个问题刚才已经得到了回答。)你的第二句话与第一句相反。当找到前20个结果时,排序无法停止,因为正如您所说,排序将在返回结果之前完成。MySQL只能在排序完成后知道前20个结果是什么。@Tom,如果按索引列排序,实际上可以。这里有解释:不是检索第5-14行吗?@adonis不,不是。这个例子就在第6行的数字5的右边。忽略了5行(0到4)。但是使用没有顺序的LIMIT BY可能会产生不一致的结果!不幸的是,在应用限制之前,必须对整个结果集进行排序,或者DBMS可以随意对结果进行排序,然后对该集进行偏移和限制。我已经读到,这可能是由于DBMS根据偏移量和限制选择了一个备用查询计划,从而导致了任意顺序。问题是询问限制和顺序。但是答案与这个问题毫无关系不,这不是必须的<代码>限制10
是限制0,10
的简写。是的,限制0,10不需要,但您可以像此限制10,20一样要求。请注意,如果一些
发布日期
相等,按它们排序不会给出确定的结果,这意味着如果您使用
限制
进行分页,你可能会在不同的页面上得到相同的项目!额外的排序实际上不会对性能产生任何可测量的影响,因为它仅限于10行/项:-)。通常,对内存中的表(子选择正在生成)进行排序非常快,并且几乎无法测量,除非您有数百万行,或者DBMS正在将结果集分页到磁盘,因为它不适合内存(在这种情况下,根据DBMS,它也可以中止查询)。非常好的主意!TXBut。。。。使用连接是可能的