如何编写带GROUP BY的UPDATE查询?能否更新不同ID同值的两行?
如何编写带GROUP BY逻辑的UPDATE查询?
嘿,我来帮你搞定这个问题!首先得说,你原来的SQL语句有两个明显问题,而且直接在UPDATE里用GROUP BY是行不通的,咱们一步步理清楚:
先修正你原始SQL的语法错误
你写的语句里deleted = 1, WHERE id = '1'多了个逗号,这会直接导致语法报错,得先删掉这个逗号。不过就算删掉逗号,UPDATE ... GROUP BY date这种写法本身也不符合SQL规范——GROUP BY是用来聚合统计数据的,而UPDATE是要定位到具体行做修改,两者不能直接这么组合。
实现你的需求:更新ID不同但date相同的行
你的目标是修改那些ID不同但date值重复的行,对吧?这里有两种常用的实现方式,适配大多数数据库:
方法1:用子查询筛选重复的date值
先通过子查询找出所有出现过多次的date(也就是有重复的date),再用这些date去匹配要更新的行:
UPDATE mine SET reason = 'is this possible?', deleted = 1 WHERE date IN ( SELECT date FROM mine GROUP BY date HAVING COUNT(*) > 1 -- 只保留出现多次的date )
注意:如果是MySQL这类数据库,直接在UPDATE的WHERE里引用原表会报错,这时候可以给子查询套一层临时表别名:
UPDATE mine SET reason = 'is this possible?', deleted = 1 WHERE date IN ( SELECT date FROM ( SELECT date FROM mine GROUP BY date HAVING COUNT(*) > 1 ) AS temp_table )
方法2:用JOIN关联(更高效,适合大表)
用JOIN把原表和筛选出重复date的子查询关联起来,直接更新匹配的行:
UPDATE mine m JOIN ( SELECT date FROM mine GROUP BY date HAVING COUNT(*) > 1 ) AS duplicate_dates ON m.date = duplicate_dates.date SET m.reason = 'is this possible?', m.deleted = 1
如果是针对特定ID对应的date更新
如果你是想更新和ID为'1'的行date相同的所有行(不管ID是不是1),那更简单,直接用子查询获取目标date即可:
UPDATE mine SET reason = 'is this possible?', deleted = 1 WHERE date = (SELECT date FROM mine WHERE id = '1')
总结
你原来的写法不可行,但通过上面的子查询或JOIN方式,完全可以实现更新ID不同但date相同的多行数据的需求。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

