Answers:
它将先排序,然后得到前20。数据库还将处理WHERE
子句中的所有内容ORDER BY
。
LIMIT
休息ORDER BY
。随着LIMIT
一个ORDER BY
返回错误的结果。LIMIT
不知何故重新排序了由ORDER BY
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
就像@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;
当我手动编写查询以检查数据库中的各种内容时,会使用此技术。我没有在生产环境中使用它,但是现在当我在基准上对其进行标记时,多余的排序不会影响性能。
如果有合适的索引(在这种情况下是在publish_date
字段上),则MySQL无需扫描整个索引即可获取请求的20条记录-在索引的开头将找到20条记录。但是,如果没有合适的索引,则需要对表进行全面扫描。
2009年有一篇MySQL Performance Blog文章。
您可以在订单末尾添加[asc]或[desc],以获得最早或最新的记录
例如,这将首先为您提供最新记录
ORDER BY stamp DESC
在此LIMIT
之后追加条款ORDER BY
您可以使用以下代码
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
,其中0是记录的起始限制,而10是记录的数量
LIMIT 10
是的简写LIMIT 0,10
。
通常将LIMIT作为最后一个操作,因此将首先对结果进行排序,然后将其限制为20。实际上,一旦找到前20个排序结果,排序就会停止。
publish_date
s相等,则按它们排序不会给出确定的结果,这意味着,如果LIMIT
用于分页,则最终可能会在不同页面上得到相同的项!