另一个MySQL MAX()问题

时间:2013-10-27 15:13:45

标签: mysql sql

我有一个动态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 table211输出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 

1 个答案:

答案 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(*)将在这种情况下执行。