可以在子查询结果中使用LIMIT吗?

4

当需要获取有序集合的最后几行时,通常会创建一个派生表并重新排序。例如,要返回带有自增id的表的最后3个元素:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 3
) t ORDER BY t.id

因为LIMIT也可以有偏移量,如果我们事先知道了行数(比如10),就可以使用以下查询来达到相同的结果:

SELECT * FROM table ORDER BY id LIMIT 3 OFFSET 7

是否可以运行子查询来计数(*)一个表并动态构建一个使用该数字的LIMIT?

SELECT * FROM table ORDER BY id LIMIT 3 OFFSET [ select count() -3 ]

2
不,LIMIT参数必须是字面量,不能是表达式。如果您需要动态计算限制,则必须在存储过程的准备查询中执行,或在客户端语言中执行。 - Barmar
我在这里大声思考,但你可能可以使用HAVINGCOUNT()。不过我得测试一下这个理论。 - Funk Forty Niner
可能是与http://stackoverflow.com/questions/41149708/using-as-to-avoid-same-query-mysql/41150070#41150070重复。 - Bill Karwin
谢谢@Fred-ii-!我想我明白你的意思了,这让我想到了类似于SELECT * FROM table WHERE id > (SELECT count(id) FROM table)-3的东西,虽然它非常特定于所有id都存在且连续自增的情况。对于原始方法适用的其他文本可能性并不太灵活。 - sidyll
@sidyll 不客气。你上面的评论代码也可以对你有帮助,因为它可以被修改使其动态工作。 - Funk Forty Niner
1个回答

6

不,无法指定动态偏移量。

使用子查询的原始查询是实现此操作的最简单方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,