0

我正在回答一个遇到此问题的关于 SO 的问题。

为什么我不能MAX()在 a 内使用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
4

5 回答 5

1

MAX()是结果行的聚合函数,但是LIMIT是限制结果行数的子句。简而言之,当您仍在确定哪些行将出现在结果中时,您不能使用依赖于结果行的函数——这根本没有任何意义。

根据文档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即使它是有效的,如果列的序列中存在间隙(例如,如果删除了一行),您给出的第一个查询也不会按照您的预期执行。

于 2013-10-25T17:08:00.740 回答
1

您可以使用带有 MAX(id) 的 HAVING 子句来获得您想要的结果

SELECT *
FROM table1
HAVING id<((SELECT Max(id) FROM table1)-5)
ORDER BY id DESC

小提琴http://sqlfiddle.com/#!2/16e50/3

于 2013-10-25T17:46:00.003 回答
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;
于 2013-10-25T17:13:09.163 回答
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;

所以这是一个树步骤。在变量中获取最大值。准备一个语句,然后执行它,将变量应用于语句。

于 2013-10-25T17:24:36.507 回答
-1

问题在于您的查询::

Select 
* 
from
myTable,
(SELECT MAX(id) as n
FROM table) temp
ORDER BY id DESC
LIMIT 0, temp.n
于 2013-10-25T17:07:53.313 回答