使用MAX()的问题

时间:2013-10-25 17:03:50

标签: mysql

我正在回答关于这个问题的问题。

为什么我无法在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

5 个答案:

答案 0 :(得分:1)

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

根据the documentationLIMIT参数必须是准备好的查询的整数常量参数(强调我的):

  

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

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

答案 4 :(得分:-1)

问题是你的查询::

Select 
* 
from
myTable,
(SELECT MAX(id) as n
FROM table) temp
ORDER BY id DESC
LIMIT 0, temp.n