我有一个动态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
答案 0 :(得分:0)
您似乎想要排除最高的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(*)
将在这种情况下执行。