我有一个这样的查询:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

ORDER BY是如何工作的?它将排序所有记录,然后获得前20条,还是将获得20条记录并根据publish_date字段对它们进行排序?

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


当前回答

可以简化为:

SELECT article FROM table1 ORDER BY publish_date

你也可以在ORDER BY中添加许多参数,这些参数是用逗号分隔的,比如:ORDER BY publish_date, tab2, tab3 DESC等等…

其他回答

可以简化为:

SELECT article FROM table1 ORDER BY publish_date

你也可以在ORDER BY中添加许多参数,这些参数是用逗号分隔的,比如:ORDER BY publish_date, tab2, tab3 DESC等等…

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

因此,您可以保证获得20篇首次发表的文章,更新的文章将不会显示。

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

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

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

您可以在顺序by的末尾添加[asc]或[desc]以获得最早或最新的记录

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

ORDER BY stamp DESC

在ORDER BY之后附加LIMIT子句

如果有一个合适的索引,在这个例子中是publish_date字段,那么MySQL不需要扫描整个索引来获得请求的20条记录——这20条记录将在索引的开始处找到。但如果没有合适的索引,则需要对表进行完整扫描。

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