别名WHERE上的子查询

时间:2019-07-17 14:47:48

标签: mysql

我有一个示例查询,假设MAX(id) = 100

SELECT id
FROM users
WHERE id < (SELECT MAX(id) FROM users) AND id > (SELECT MAX(id) FROM users)-50

我从ids范围内的该查询50 to 100中获取信息,并且按预期运行

但是我希望它更短一些,所以我尝试使用这样的别名

SELECT id
FROM users
WHERE id < (SELECT MAX(id) FROM users) AS maxid AND id > maxid-50

但是它不起作用,然后我尝试定义这样的变量

SELECT id
FROM users
WHERE id < @x = (SELECT MAX(id) FROM users) AND id > @x-50

但收到

的通知
Impossible WHERE noticed after reading const tables

如何一次计算MAX(id)以节省性能?

2 个答案:

答案 0 :(得分:1)

这是短语查询的一种方法,只需使用一次子查询即可:

SELECT id
FROM users
WHERE (SELECT MAX(id) FROM users) BETWEEN id + 1 AND id + 49;

也就是说,在您的第一个版本中,我希望MySQL优化器足够聪明,可以缓存掉max子查询的结果,从而只计算一次。因此,您的第一个版本没有问题。

答案 1 :(得分:1)

您可以在查询之前定义变量:

set @maxid = (select max(id) from users);
SELECT id
FROM users
WHERE id > @maxid - 50 and id < @maxid;

请参见demo