首页 文章

MYSQL - ORDER BY&LIMIT

提问于
浏览
196

我有一个看起来像这样的查询:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

ORDER BY如何工作?它会订购所有记录,然后获得前20个记录,还是会获得20条记录并按 publish_date 字段订购?

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

9 回答

  • 207

    它将首先订购,然后获得前20个 . 数据库也将在 ORDER BY 之前处理 WHERE 子句中的任何内容 .

  • 7

    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

  • 1

    如果有一个合适的索引,在这种情况下是 publish_date 字段,那么MySQL不需要扫描整个索引来获取所请求的20条记录 - 这20条记录将在索引的开头找到 . 但如果没有合适的索引,则需要对表进行全面扫描 .

    从2009年开始有一个MySQL Performance Blog article .

  • 7

    您可以在订单末尾添加[asc]或[desc]以获取最早或最新的记录

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

    ORDER BY stamp DESC
    

    ORDER BY 之后附加 LIMIT 子句

  • 4

    正如@James所说,它将订购所有记录,然后获得前20行 .

    事实如此,您可以保证获得20篇首次发表的文章,新版文章将不会显示 .

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

    当我手动编写查询来检查数据库中的各种事物时,我使用这种技术 . 我没有在 生产环境 环境中使用它,但是现在当我标记它时,额外的排序不会影响性能 .

  • 5

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

  • 34

    LIMIT通常作为最后一个操作应用,因此结果将首先进行排序,然后限制为20.实际上,只要找到前20个排序结果,排序就会停止 .

  • -1

    LIMIT的语法根据数据库的不同而不同,例如:

    mysql - 限制1,2

    postgres - LIMIT 2 OFFSET 1

  • -1
    SELECT * FROM table1 ORDER BY id asc LIMIT 5 OFFSET 0
    

    查询必须是这样的

相关问题