我有一个看起来像这样的查询:
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 LIMIT 20
ORDER BY 是如何工作的?它会排序所有记录,然后获取前 20 条记录,还是获取 20 条记录并按publish_date
字段排序?
如果它是最后一篇,则不能保证您真正获得最新的 20 篇文章。
它将首先排序,然后获取前 20 个。数据库还将处理WHERE
before 子句中的任何内容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。
正如@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;
当我手动编写查询来检查数据库的各种内容时,我会使用这种技术。我没有在生产环境中使用过它,但是现在当我对它进行基准标记时,额外的排序不会影响性能。
您可以在订单末尾添加[asc]或[desc]以获取最早或最新的记录
例如,这将首先为您提供最新记录
ORDER BY stamp DESC
在后面加上LIMIT
子句ORDER BY
如果有合适的索引,在这种情况下在publish_date
字段上,那么 MySQL 不需要扫描整个索引来获取请求的 20 条记录——这 20 条记录将在索引的开头找到。但如果没有合适的索引,则需要对表进行全扫描。
2009 年有一篇关于此的MySQL 性能博客文章。
您可以使用此代码
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
,其中 0 是记录的开始限制和 10 条记录
LIMIT 通常作为最后一个操作应用,所以会先对结果进行排序,然后限制为 20 个。实际上,只要找到前 20 个排序结果,排序就会停止。
可以简化为:
SELECT article FROM table1 ORDER BY publish_date DESC FETCH FIRST 20 ROWS ONLY;
ORDER BY
您还可以在仅以逗号分隔的参数中添加许多参数,例如:ORDER BY publish_date, tab2, tab3 DESC
等...