我有一个示例查询,假设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)以节省性能?
答案 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。