基本上我需要做这样的事情......这只是一个例子......但是第一个查询的语法在 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>;
只有一个人可以在任何类别中获得金奖。我只知道获得金奖的人的 person_id。
我试图在第一个查询中删除与 person_id 在同一类别中的任何以前的金奖得主。然后在第二个中设置新的金牌得主。
我相信我需要使用某种类型的内部联接,但我对此不是 100% 确定。
如果我可以在一个查询中完成所有操作,那会更聪明!
任何人都可以提供建议吗?
谢谢:)
最佳答案
在单个 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';
或者这个选择:
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;
关于sql - mysql在同一表的UPDATE中嵌套SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916789/