2

我有一个动态 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 table211COUNT(*)&577的输出MAX(ID)

因此,如果我更改5400它可以工作,但它会从结果中排除第一个 34ID。对于@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 
4

1 回答 1

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(*)在这种情况下会这样做。

于 2013-10-27T15:31:08.243 回答