我正在回答关于这个问题的问题。
为什么我无法在MAX()
中使用LIMIT
?
SELECT *
FROM table
ORDER BY id DESC
LIMIT 0, MAX(id)
或者
SELECT *, MAX(id) AS m
FROM table
ORDER BY id DESC
LIMIT 0, m
两者都给出了类似的语法错误:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX(id)' at line 4
通缉查询:
SELECT *
FROM table
ORDER BY id DESC
LIMIT 0, MAX(id)-5
答案 0 :(得分:1)
MAX()
是结果行的聚合函数,但LIMIT
是一个约束结果行数的子句。简而言之,当您仍在确定结果中的哪些行时,您不能使用依赖于结果行的函数 - 这根本没有任何意义。
根据the documentation,LIMIT
参数必须是准备好的查询的整数常量或参数(强调我的):
LIMIT
需要一个或两个数字参数,必须都是非负整数常量(使用预准备语句时除外)。
语法规范不允许使用列或函数。您必须预先计算该值,然后在准备好的查询中使用它(或通过字符串替换,但我会避免这种情况)。
根据您在问题中提供的查询:
SELECT *
FROM table
ORDER BY id DESC
LIMIT 0, MAX(id)-5
我怀疑这是你真正想要的查询:
SELECT *
FROM table
WHERE id <= (SELECT MAX(id) FROM table) - 5
ORDER BY id DESC
即使它有效,如果id
列的序列中存在间隙(例如,如果删除了某行),则您提供的第一个查询将无法执行您所期望的操作。
答案 1 :(得分:1)
如果您想获得所需的结果,另一种方法是创建动态sql。
SET @maxID = (SELECT MAX(ID) FROM tableName);
SET @sql = CONCAT('SELECT *
FROM tableName
ORDER BY ID DESC
LIMIT 0,', @maxID);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
答案 2 :(得分:1)
函数MAX不能在限制上使用。
以下是文档:
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_max
限制中的count参数应该是一个值,因此您无法在一个步骤中执行该操作。以下是选择文档:
http://dev.mysql.com/doc/refman/5.0/en/select.html
你能做的是:
SET @a=(SELECT MAX(ID) FROM table);
PREPARE STMT FROM 'SELECT * FROM table ORDER BY id DESC LIMIT 0, ?';
EXECUTE STMT USING @a;
所以这是一个树步。获取变量中的最大值。准备一个语句,然后执行它,将变量应用于语句。
答案 3 :(得分:1)
您可以使用带有MAX(id)的HAVING子句来获得所需的结果
SELECT *
FROM table1
HAVING id<((SELECT Max(id) FROM table1)-5)
ORDER BY id DESC
答案 4 :(得分:-1)
问题是你的查询::
Select
*
from
myTable,
(SELECT MAX(id) as n
FROM table) temp
ORDER BY id DESC
LIMIT 0, temp.n