Mysql在单个查询中使用if条件的多个select语句

我有桌子 用户 ID,名称,类型,活动......

我还有另一个表 orders 带有orderid,userid,...

我想以这样的方式更新订单表

UPDATE orders 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语句,但不起作用

windls 回答:Mysql在单个查询中使用if条件的多个select语句

这是使用ORDER BY的一种方法:

UPDATE orders o
    SET userid = (SELECT u.id
                  FROM users u
                  WHERE u.type = 'some'
                  ORDER BY active DESC
                  LIMIT 1
                 );

这假设active仅采用值01。如果还有其他值,请使用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会用相关子查询中的聚合使我感到惊讶。也就是说,如果给定类型的行很少,则性能差异可能不会很明显。

本文链接:https://www.f2er.com/3166733.html

大家都在问