我有一个动态 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
211
为COUNT(*)
&577
的输出MAX(ID)
因此,如果我更改5
为400
它可以工作,但它会从结果中排除第一个 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