我有一个动态 SQL 查询:
SET @a=(SELECT MAX(ID) FROM table);
PREPARE STMT FROM 'SELECT * FROM table ORDER BY id DESC LIMIT 0, ?';
EXECUTE STMT USING @a;
这按预期正常工作。不过,我想从这个 查询中减去最后 5 行。
所以我用了两种方式:
1- SET @a=(SELECT (MAX(ID)-5) FROM table);
2- SET @a := @a-5;
奇怪的是,它运行了,但结果与完整查询没有任何区别,并且所有行都被提取了!
非常感谢有关此主题的任何解释。
更新 #1
最后 20
行没有间隙,如果我将 5
更改为更大的数字,如 200
,结果也是一样的.
更新 #2
SELECT COUNT(*), MAX(ID) FROM table
为 COUNT(*)
和 577
输出 211
code> 为 MAX(ID)
因此,如果我将 5
更改为 400
它会起作用,但它会从结果中排除 first 34
ID .这种排除方式也适用于@Laurence 的回答。
更新 #3
将这些 ID 视为 table
表中的总行。
| ID |
+----+
| 55 |
| 54 |
| 53 |
| 52 |
| 51 |
查看有关以下查询更改的结果(顺序是我定义的 DESC):
# @a is MAX(id) = 55
SET @a := @a-5;
=> query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-5/*50*/ -- no effects in result
SET @a := @a-50;
=> query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-50/*5*/ -- no effects in result
SET @a := @a-51;
=> query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-51/*4*/ -- will exclude row `51` from the result so `55, 54, 53, 52` are fetched
最佳答案
您似乎想排除最高的 5 个 ID,并按 ID 降序对结果进行排序。为此,您可以从 5 点开始限制:
Set @a = (Select Count(*) From table);
Prepare stmt From 'Select * From table Order By id desc Limit 5, ?';
Execute stmt Using @a;
要了解这是如何工作的,想象一下在应用限制之前的结果(仅限 id):
55, 54, 53, 52, 51, 50, 49, ...
Limit 5, n
表示从第6行开始返回n行,即
50, 49, ...
这里 @a
只需要足够大就可以得到所有的结果。你可以只使用一个非常大的数字而不用担心是否精确。假设 id 是唯一的,max(id)
或 count(*)
将在这种情况下执行。
关于mysql - 另一个 MySQL MAX() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19619621/