sql - mysql在同一表的UPDATE中嵌套SELECT

标签 sql mysql 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>;

只有一个人可以在任何类别中获得金奖。我只知道获得金奖的人的 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/

相关文章:

hadoop - Hive 查询不断失败。如何以最佳方式连接非常大的表?

sql - 在子查询之间的ORACLE join语句中选择顶部记录

mysql - 在单个 MySQL 查询中,我可以从具有主键数组的字段返回字符串数组吗

python - 将 Django 与包含多个表的遗留数据库一起使用

php - excel导入MySQL后出现未知字符,如何避免?

sql - 将多个 SQL 字段显示为单个字段

跨 2 个集合的 Mongodb map 减少

python - 计算按周分组的单个列上值的出现次数

java - 在 Java 中将字符串转换为 Clob

mysql - 将两个条件与不同的表 MySQL 结合起来