基本上我需要做这样的事情......这只是一个例子......但是第一个查询的语法在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)
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)
| 归档时间: |
|
| 查看次数: |
34193 次 |
| 最近记录: |