MYSQL - ORDER BY&限制

时间:2011-01-16 23:06:09

标签: mysql sql sql-order-by sql-limit

我有一个如下所示的查询:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

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

如果是最后一篇,那么您无法保证能够获得最新的20篇文章。

9 个答案:

答案 0 :(得分:220)

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

答案 1 :(得分:36)

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

答案 2 :(得分:8)

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

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

ORDER BY stamp DESC

LIMIT

之后附加ORDER BY子句

答案 3 :(得分:7)

如果有一个合适的索引,在本例中是publish_date字段,那么MySQL不需要扫描整个索引来获取所请求的20条记录 - 这20条记录将在索引的开头找到。但如果没有合适的索引,则需要对表格进行全面扫描。

2009年就有MySQL Performance Blog article

答案 4 :(得分:7)

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

如果是这样,你可以保证获得20篇首发文章,新版文章将不会出现。

在您的情况下,我建议您将desc添加到order 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;

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

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

order by t.publish_date asc;

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

答案 5 :(得分:4)

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

答案 6 :(得分:2)

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

答案 7 :(得分:0)

可以简化为:

SELECT article FROM table1 ORDER BY publish_date DESC FETCH FIRST 20 ROWS ONLY;

您还可以在ORDER BY中添加许多以逗号分隔的参数,例如:ORDER BY publish_date, tab2, tab3 DESC等...

答案 8 :(得分:-2)

根据数据库,LIMIT的语法也不同, 例如:

mysql - LIMIT 1,2

postgres - 限制2 OFFSET 1