mysql - 另一个 MySQL MAX() 问题

标签 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 tableCOUNT(*)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/

相关文章:

php - Ajax 读取数据库

MYSQL 关系查询问题

c# - Debug 和 Release 之间有什么(性能)差异吗?

php - 如何按名称列出两个连接表信息(一些有名称,一些可能为空)

sql - SELECT之前要ORDER BY?

mysql - 使用 MySQL 根据另一列中的不同值聚合一列时排除重复行

mysql - 将所有成功登录保存到 MySQL 数据库...明智吗?

mysql - 如何为mysql中的每个用户获取计数值最高的行

sql - 我如何在更新前后验证一行

sql - 大查询 : Select a column with any value not in group by clause