代码之家  ›  专栏  ›  技术社区  ›  JamesWang

为什么“if(id=max(id),id,id+1)”在mysql中不能正常工作

  •  0
  • JamesWang  · 技术社区  · 5 年前

    在下表中 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

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

    谢谢

    1 回复  |  直到 5 年前
        1
  •  2
  •   Tim Biegeleisen    5 年前

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

    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;