mysql在同一个表的UPDATE中嵌套SELECT

ada*_*dam 11 mysql sql join

基本上我需要做这样的事情......这只是一个例子......但是第一个查询的语法在MySQL中不起作用

update people set prize = '' 
where prize = 'Gold' and class = (select class from people where id = person_id);
update people set prize = 'Gold' where id = <id>;
Run Code Online (Sandbox Code Playgroud)

任何一个班级中只有一人可以获得金奖.我只知道获得金奖的人的person_id.

我试图在第一个查询中删除与person_id在同一类中的任何以前的金奖获奖者.然后在第二个中设置新的金牌获胜者.

我相信我需要使用某种类型的内连接,但我不是百分之百确定.

如果我能在一个查询中完成所有操作,那会更聪明!

任何人都可以提出建议吗?

谢谢 :)

Bil*_*win 10

在单个SQL查询中进行复杂更新并不总是最好的.实际上,运行两个简单查询可能更有效.因此,请务必对两种解决方案进

MySQL支持UPDATE多表更新语法的扩展.您可以执行JOIN更新而不是使用子查询.

然后,您可以使用IF()函数(或CASE)prize有条件地将值更改为不同的值.

因此,如果您绝对必须使用单个查询,请尝试以下方法:

UPDATE people p1 JOIN people p2 
  ON (p1.class = p2.class AND p2.id = <person_id>)
SET prize = IF(p1.id = <person_id>, 'Gold', '')
WHERE p1.id = <person_id> OR p1.prize = 'Gold';
Run Code Online (Sandbox Code Playgroud)

或者这个选择:

UPDATE people p1 JOIN people p2 
  ON (p1.class = p2.class AND p2.id = <person_id>)
SET p1.prize = CASE 
  WHEN p1.id = <person_id> THEN 'Gold'
  WHEN p1.prize = 'Gold' THEN ''
  ELSE p1.prize -- other cases are left as is
 END CASE;
Run Code Online (Sandbox Code Playgroud)


Qua*_*noi 7

UPDATE people
SET    prize = CASE WHEN id = @lucky THEN 'Gold' ELSE 'Silver' END
WHERE  class = (
       SELECT  class
       FROM    people
       WHERE   id = @lucky
       )
Run Code Online (Sandbox Code Playgroud)

这将授予所有用户提供了Silver奖品,除了@lucky一个谁得到Gold.

如果您只需要更新@lucky前冠军,请发出以下命令:

UPDATE people
SET    prize = CASE WHEN id = @lucky THEN 'Gold' ELSE 'Silver' END
WHERE  id = @lucky
       OR (class, prize) =
       (
       SELECT  class, 'Gold'
       FROM    people
       WHERE   id = @lucky
       )
Run Code Online (Sandbox Code Playgroud)