MYSQL – ORDER BY&LIMIT

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

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

ORDER BY如何工作? 它会sorting所有logging,然后得到前20个,或将获得20个logging,并通过publish_date字段publish_date

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

它会先sorting,然后得到前20个。数据库还会在ORDER BY之前处理WHERE子句中的任何内容。

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

如果有一个合适的索引,在这种情况下,在publish_date字段上,那么MySQL不需要扫描整个索引来获取请求的20条logging – 这20条logging将在索引的起始处find。 但是,如果没有合适的索引,则需要对表格进行全面扫描。

有一个从2009年的MySQL性能博客文章

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

例如,这会首先给你最新的logging

 ORDER BY stamp DESC 

ORDER BY之后附加LIMIT子句

您可以使用此代码SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10其中0是logging的起始限制和10logging数

就像@詹姆斯说的,它会sorting所有logging,然后得到前20行。

因为如此,你保证得到20个第一次发表的文章,新的将不会显示。

在你的情况下,我build议你order by publish_date添加desc order by publish_date ,如果你想要最新的文章,那么最新的文章将是第一个。

如果你需要保持结果的升序,并且只想要10个最新的文章,你可以要求mysql对你的结果进行两次sorting。

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

 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; 

当我手动编写查询来检查数据库的各种事情时,我使用这种技术。 我没有在生产环境中使用过它,但现在当我在工作台上标记它时,额外的sorting不会影响性能。

LIMIT通常作为最后一个操作来应用,因此结果将首先被sorting,然后被限制为20.事实上,只要find前20个sorting结果,sorting就会停止。

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

mysql – LIMIT 1,2

postgres – LIMIT 2 OFFSET 1