为什么`if(id = max(id),id,id + 1)在mysql中无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么`if(id = max(id),id,id + 1)在mysql中无法正常工作相关的知识,希望对你有一定的参考价值。

在下表People中:

id name
 1 James
 2 Yun
 3 Ethan

如果我想找到可以运行此查询的最大ID

select max(id) id from People;

结果是

id
 3 

如果我想为除最后一行以外的所有行将id增加1,我尝试了此操作:

select if(id=max(id), id, id+1) id, name from People

令人惊讶的是,我得到了

enter image description here

为什么max()不能像以前那样工作?为什么只返回一行(看起来像第一行)?我想我知道如何解决此问题,如下所示:

select if(id=lastID, id, id+1) id,, name from People,
(select max(id) lastID from People) People_max
order by id;

然后我得到了我所期望的:

enter image description here

但是我想我仍然不知道为什么前一个不起作用。

谢谢

答案

您需要使用子查询来获取最大值:

SELECT
    IF(id = (SELECT MAX(id) FROM People), id, id+1) id,
    name
FROM People
ORDER BY id;

[当您在原始单级查询中引用MAX(id)时,您是在告诉mysql以表级聚合模式执行查询。这意味着它将只返回代表整个表的汇总的单个记录。通过切换到子查询,它可以按照您想要的方式运行。顺便说一句,如果您使用的是MySQL 8+,那么我们可以在此处使用解析函数来使查询的详细程度降低:

SELECT
    IF(id = MAX(id) OVER (), id, id+1) id,
    name
FROM People
ORDER BY id;

以上是关于为什么`if(id = max(id),id,id + 1)在mysql中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:max(id)+1 和 sequence.nextval 之间的区别

sql中if then的使用

如何在 tweepy(python)中获取推文 ID(since_id,max_id)?

压缩或重新编号所有表的 ID,并将序列重置为 max(id)?

max id 的日期:sql/oracle 优化

没有分组依据的 MAX 函数