我有 table 用户 带有 id、名称、类型、事件、...
我有另一个表订单 带有 orderid,userid,...
我想以这样的方式更新订单表
更新订单 SET userid=(SELECT id FROM users WHERE type="some"and active=1)
但我的问题是
如果 SELECT id FROM users WHERE type="some"and active=1
没有任何结果
我想用
SELECT id FROM users WHERE type="some"limit 0,1
即第一个结果
我可以用任何语言轻松做到这一点,比如 php/python 等,但我只能访问 mysql 服务器,所以不能那样做
但是我如何在单个查询中用纯 sql 做
我试过 if 语句但没有用
最佳答案
这是一种使用 ORDER BY
的方法:
UPDATE orders o
SET userid = (SELECT u.id
FROM users u
WHERE u.type = 'some'
ORDER BY active DESC
LIMIT 1
);
这假设 active
仅采用值 0
和 1
。如果有其他值,请使用 ORDER BY (active = 1) DESC
。
users(type, active, id)
上的索引性能应该没问题。
另一种方法使用聚合和COALESCE()
:
UPDATE orders o
SET userid = (SELECT COALESCE(MAX(CASE WHEN active = 1 THEN u.id END),
MAX(u.id)
)
FROM users u
WHERE u.type = 'some'
);
我希望 ORDER BY
会快一点,但有时 MySQL 在相关子查询中的聚合会让我感到惊讶。也就是说,如果给定类型的行很少,性能差异可能不会很明显。
关于带有if条件的单个查询中的Mysql多个select语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58693576/