带有if条件的单个查询中的Mysql多个select语句

标签 mysql sql

我有 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 仅采用值 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 在相关子查询中的聚合会让我感到惊讶。也就是说,如果给定类型的行很少,性能差异可能不会很明显。

关于带有if条件的单个查询中的Mysql多个select语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58693576/

相关文章:

php - 使用 session 的多步注册表 PHP/MySql

java - 使用 http-post 和 AsyncTask 将数据插入 MySQL 不起作用

java - 在 Java JDBC 中将高分保存到数据库中

sql - 从 SQL Server 表中删除重复项

php - 如何在 SQL 中执行多个更新查询

c# - Linq-to-entities,一次查询得到结果+行数

MySQL 如何显示给定表的列信息?

mysql - 无法获取所需的行?

sql - 在 SQL 中,如何删除左侧的前 3 个字符以及特定字符后右侧的所有内容

MySQL 查询需要将现有日期更新 8