我有一个查询如下所示:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
如何按工作顺序排序?它是先订购所有记录,然后再订购前20条记录,还是先订购20条记录,然后再按publish_date字段订购?
如果这是最后一篇文章,你就不一定能得到最近20篇文章。
- 请注意,如果某些publish_date是相等的,则按它们排序不会产生确定的结果,这意味着如果使用LIMIT进行分页,则可能会在不同的页面上得到相同的项目!
它将先订购,然后得到前20个。数据库还将处理ORDER BY之前的WHERE子句中的任何内容。
- 那么时间是一样的吗?
- 错!法国电力公司回归错误的结果有人把结果归还给了ORDER BYSomehow reorders the result set returned by ORDER BY
- 格林,你错了Read this for the explanation:dev.mysql.com/doc/refman/5.7/en/limit-optimization.html when the order by column is indexed,it may return records in a different order than without the limit,when there are more than 1 records with the same value in that column.
- 一个快速解决这些问题的方法是,增加一个更高的柱,以优惠的方式排序,具有独特的值,这样,当第一阶柱值与多根相同时,数据库就有一个一致的规则来排序。
limit子句可用于约束select语句返回的行数。limit接受一个或两个数值参数,这两个参数都必须是非负整数常量(使用PREPARED语句时除外)。
对于两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为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
换句话说,限制行数等于限制行数0。
所有详细信息:http://dev.mysql.com/doc/refman/5.0/en/select.html
- 这不是追踪5-14路吗?
- @Adonis No,it's not.The example is right from the mysql documentation
- 5号是第六街。5 Rows(0 through 4)are ignored.
- 但是,使用没有命令的限制,可能会产生不一致的结果!不幸的是,在应用限制之前,整个结果必须排序,或者DBMS可以任意排序结果,然后将结果转换成偏移和限制。我读到,这可能是由于DBMS选择了一个基于胶印的交替查询计划,并限制了仲裁令。
- 问题是要求限制。但答案与这个问题无关。
您可以在订单结束时添加[asc]或[desc]以获取最早或最新的记录。
例如,这将首先为您提供最新的记录
在ORDER BY后追加LIMIT条款
- 欢迎来到Stackoverflow。我想你可能误解了这个问题。我相信他们是在问操作的次序,而不是"如何处理"。(但自从这个问题早已被解答以来,这一点已变得越来越重要。)
如果有合适的索引,在本例中,在publish_date字段上,那么mysql不需要扫描整个索引来获得所请求的20条记录——20条记录将在索引的开头找到。但是如果没有合适的索引,那么就需要对表进行全面扫描。
这上面有一篇2009年的MySQL性能博客文章。
正如@james所说,它将订购所有记录,然后获得前20行。
正因为如此,我们保证您将获得20篇首次发表的文章,而新的文章将不会显示。
在您的情况下,我建议您在order by publish_date中添加desc,如果您想要最新的文章,那么最新的文章将是第一篇。
如果您需要保持结果的升序,并且仍然只需要10篇最新的文章,您可以要求MySQL对结果进行两次排序。
下面的查询将结果降序排序,并将结果限制为10(即括号内的查询)。它仍将按降序排序,我们对此不满意,因此我们要求MySQL再次对其进行排序。现在我们有了最后一行的最新结果。
如果您需要所有列,可以这样做:
当我手动编写查询来检查数据库的各种情况时,我使用这种技术。我没有在生产环境中使用它,但是现在当我对它进行基准测试时,额外的排序不会影响性能。
- 您的额外输出几乎不可能对性能产生任何可测量的影响,因为它仅限于10个rows/items:-)。一般来说,一个记忆表(其中一个亚选择是产生的)很快,很容易测量,除非你有数百万根根,或者DBMS是在不产生记忆的情况下调用磁盘的结果集(例如,在DBMS上取决于它也能到达Query)。
您可以使用此代码SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10其中0是记录的起始限制和10个记录数
- 不需要爱德华王子岛大学
- 是的,不要求限额0.10,但你可以要求限额10.20
限制通常应用于最后一个操作,因此结果将首先排序,然后限制为20。事实上,一旦找到前20个排序结果,排序就会停止。
- 你的第二次判决是针对你的第一次。当发现第一个20个结果时,输出不能停止,因为当你说输出将在结果回来之前完成。Mysql只能知道第一个20个结果是什么
- @Tom,actually it can,if ordering by an index column.It's explained here:dev.mysql.com/doc/refman/5.7/en/limit-optimization.html
根据数据库的不同,限制的语法也不同,例如:
mysql—限值1、2
postgres—限值2偏移量1