MYSQL - ORDER BY&LIMIT

Ale*_*lex 232 mysql sql sql-order-by sql-limit

我有一个看起来像这样的查询:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

ORDER BY如何工作?它会订购所有记录,然后获得前20个记录,还是会得到20个记录并按publish_date现场订购?

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

Jam*_*mes 231

它将首先排序,然后获得前20个.数据库也将在WHERE之前的子句中处理任何内容ORDER BY.

  • @Green,你错了.阅读以下解释:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html当ORDER BY列被编入索引时,它可能以不同于LIMIT的顺序返回记录,当该列中有多个具有相同值的记录时. (6认同)
  • 错误!`LIMIT`打破`ORDER BY`.使用`LIMIT`和`ORDER BY`会返回错误的结果.`LIMIT`以某种方式重新排序`ORDER BY`返回的结果集 (5认同)
  • 此类问题的一个快速解决方案是通过最好具有唯一值来添加一列以进行排序,以便数据库在多行的第一个按列排序的值相同时获得一致的行排序规则。 (2认同)

ben*_*siu 37

LIMIT子句可用于约束SELECT语句返回的行数.LIMIT需要一个或两个数字参数,它们都必须是非负整数常量(使用预准备语句时除外).

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

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

要从特定偏移量检索所有行直到结果集的末尾,可以使用一些大数字作为第二个参数.此语句检索从第96行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

使用一个参数,该值指定从结果集的开头返回的行数:

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

换句话说,LIMIT row_count相当于LIMIT 0,row_count.

所有详细信息:http://dev.mysql.com/doc/refman/5.0/en/select.html

  • 问题是要求限制和订单.但答案与这个问题无关 (4认同)

mar*_*ton 7

如果在该publish_date字段中存在合适的索引,则MySQL不需要扫描整个索引以获取所请求的20条记录 - 将在索引的开头找到20条记录.但是如果没有合适的索引,则需要对表进行全面扫描.

一篇关于2009年的MySQL性能博客文章.


小智 7

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

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

ORDER BY stamp DESC
Run Code Online (Sandbox Code Playgroud)

LIMIT之后附加该条款ORDER BY

  • 欢迎来到stackoverflow.我想你可能误解了这个问题.我相信他们询问的是操作顺序而不是"如何排序".(但是这个问题已经在前一段时间内得到了解答,这是没有实际意义的;) (3认同)

ema*_*ren 7

正如@James所说,它将订购所有记录,然后获得前20行.

事实如此,您可以保证获得20篇首次发表的文章,新版文章将不会显示.

在你的情况,我建议你添加descorder by publish_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;
Run Code Online (Sandbox Code Playgroud)

如果您需要所有列,则以这种方式完成:

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

order by t.publish_date asc;
Run Code Online (Sandbox Code Playgroud)

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

  • 您的额外排序几乎不会对性能产生任何可衡量的影响,因为它仅限于10行/项:-).通常排序内存表(子选择正在生成)非常快且几乎不可测量,除非您有数百万行或DBMS将结果集分页到磁盘,因为它不适合内存(在这种情况下)根据DBMS,它也可以中止查询). (2认同)

gau*_*iya 5

您可以使用此代码 SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 ,其中0是记录的开始限制而10是记录的数量

  • 不,不是*必需*。LIMIT 10是LIMIT 0,10的简写。 (8认同)
  • 是的,不需要LIMIT 0,10,但您可以要求像这样的Limit 10,20 (2认同)