我有一个看起来像这样的查询:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
ORDER BY如何工作?它会订购所有记录,然后获得前20个记录,还是会获得20条记录并按 publish_date 字段订购?
publish_date
如果它是最后一个,你不能保证真正得到最近的20篇文章 .
它将首先订购,然后获得前20个 . 数据库也将在 ORDER BY 之前处理 WHERE 子句中的任何内容 .
ORDER BY
WHERE
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 Performance Blog article .
您可以在订单末尾添加[asc]或[desc]以获取最早或最新的记录
例如,这将首先为您提供最新记录
ORDER BY stamp DESC
在 ORDER BY 之后附加 LIMIT 子句
LIMIT
正如@James所说,它将订购所有记录,然后获得前20行 .
事实如此,您可以保证获得20篇首次发表的文章,新版文章将不会显示 .
在你的情况下,我建议你添加 desc 到 order by publish_date ,如果你想要最新的文章,那么最新的文章将是第一篇 .
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;
当我手动编写查询来检查数据库中的各种事物时,我使用这种技术 . 我没有在 生产环境 环境中使用它,但是现在当我标记它时,额外的排序不会影响性能 .
您可以使用此代码 SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 ,其中0是记录的起始限制和10个记录数
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
LIMIT通常作为最后一个操作应用,因此结果将首先进行排序,然后限制为20.实际上,只要找到前20个排序结果,排序就会停止 .
LIMIT的语法根据数据库的不同而不同,例如:
mysql - 限制1,2
mysql
postgres - LIMIT 2 OFFSET 1
postgres
SELECT * FROM table1 ORDER BY id asc LIMIT 5 OFFSET 0
查询必须是这样的
9 回答
它将首先订购,然后获得前20个 . 数据库也将在
ORDER BY
之前处理WHERE
子句中的任何内容 .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 Performance Blog article .
您可以在订单末尾添加[asc]或[desc]以获取最早或最新的记录
例如,这将首先为您提供最新记录
在
ORDER BY
之后附加LIMIT
子句正如@James所说,它将订购所有记录,然后获得前20行 .
事实如此,您可以保证获得20篇首次发表的文章,新版文章将不会显示 .
在你的情况下,我建议你添加
desc
到order by publish_date
,如果你想要最新的文章,那么最新的文章将是第一篇 .如果你需要按升序保存结果,并且仍然只想要10篇最新文章,你可以让mysql对结果进行两次排序 .
下面的查询将对结果进行降序排序,并将结果限制为10(即括号内的查询) . 它仍将按降序排序,我们对此不满意,因此我们要求mysql再次对其进行排序 . 现在我们在最后一行有最新的结果 .
如果您需要所有列,则以这种方式完成:
当我手动编写查询来检查数据库中的各种事物时,我使用这种技术 . 我没有在 生产环境 环境中使用它,但是现在当我标记它时,额外的排序不会影响性能 .
您可以使用此代码
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
,其中0是记录的起始限制和10个记录数LIMIT通常作为最后一个操作应用,因此结果将首先进行排序,然后限制为20.实际上,只要找到前20个排序结果,排序就会停止 .
LIMIT的语法根据数据库的不同而不同,例如:
mysql
- 限制1,2postgres
- LIMIT 2 OFFSET 1查询必须是这样的