按最大值和列进行选择以返回一条记录的最佳实践



我刚刚了解到,在我的环境中,full_group_by模式已被禁用。例如,如果我想在另一列上获得一个列(名称(和一个最大值(id(,并只返回这一条记录,我会做一些类似的事情

SELECT max(id), name
FROM TABLE;

但是,只有禁用only_full_group_by时,这才有效。对此的替代方案,我认为最有可能的更好的方式和公认的做法是,

SELECT id, name
FROM TABLE
WHERE id = (SELECT max(id) from TABLE);

这里的正确和最佳做法是什么?我喜欢第一个,也许是因为我一直都是这样做的,而且它的代码更少。第二种方法似乎读起来更好,返回的内容也更清楚,但似乎更慢,因为我正在WHERE中执行另一个SELECT语句。

根据ANSI标准,您的第一个查询是无效的SQL,应该避免。如果您只期望单个记录具有最大id值,或者,如果存在平局,并且您不关心返回哪个单个记录,则可以使用LIMIT查询:

SELECT id, name
FROM yourTable
ORDER BY id DESC
LIMIT 1;

否则,如果你需要所有的领带,那么使用你的第二个版本:

SELECT id, name
FROM yourTable
WHERE id = (SELECT MAX(id) FROM yourTable);

注意,从MySQL 8+开始,我们也可以在这里使用RANK()分析函数来获取所有关系:

WITH cte AS (
SELECT *, RANK() OVER (ORDER BY id DESC) rnk
FROM yourTable
)
SELECT id, name
FROM cte
WHERE rnk = 1;

最新更新