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.
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
如果在该publish_date字段中存在合适的索引,则MySQL不需要扫描整个索引以获取所请求的20条记录 - 将在索引的开头找到20条记录.但是如果没有合适的索引,则需要对表进行全面扫描.
有一篇关于2009年的MySQL性能博客文章.
小智 7
您可以在订单末尾添加[asc]或[desc]以获取最早或最新的记录
例如,这将首先为您提供最新记录
ORDER BY stamp DESC
Run Code Online (Sandbox Code Playgroud)
在LIMIT之后附加该条款ORDER BY
正如@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;
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)
当我手动编写查询以检查数据库中的各种内容时,我使用此技术.我没有在生产环境中使用它,但是现在当我标记它时,额外的排序不会影响性能.
您可以使用此代码
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
,其中0是记录的开始限制而10是记录的数量