【问题标题】:Update table based on subquery with if condition基于带有 if 条件的子查询更新表
【发布时间】:2016-08-24 07:40:44
【问题描述】:

我想实现这样的目标:

update bill b set b.isPaid = (if(select count(*) from bill_payment p where p.bill_id = b.id) > 0,true,false);

但我收到此错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“select count(*) from res_bill_payment p where p.bill_id = b.id) > 0,true,false)”附近使用正确的语法

我如何在 mySQL 中做到这一点?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我建议使用EXISTS

    UPDATE bill b
        SET b.isPaid = (EXISTS (SELECT 1
                                FROM bill_payment p
                                WHERE p.bill_id = b.id
                               ) 
                       );
    

    EXISTS 子句返回一个布尔值,因此无需显式使用 TRUEFALSE(除非您真的非常想这样做)。

    为此,我强烈建议使用EXISTS 而不是COUNT(*),因为它通常具有更好的性能。 EXISTS 可以在第一个匹配记录处停止,而不必计算所有匹配记录。

    【讨论】:

    • 最佳答案@Gordon Linoff 我会关注这个.. 谢谢你的帮助..!!
    【解决方案2】:

    您似乎缺少一些括号:

    UPDATE bill b 
    SET b.isPaid = (IF(
                      (
                        SELECT COUNT(*) 
                        FROM bill_payment p 
                        WHERE p.bill_id = b.id
                      ) > 0
                      ,TRUE
                      ,FALSE
                    ));
    

    【讨论】:

    • 没问题,但为了提高性能,您应该尝试@gordon-linoff 回答并使用 EXISTS 子句
    【解决方案3】:
    UPDATE bill b
    SET b.isPaid = true
        WHERE
              (SELECT count(*)
               FROM bill_payment p
               WHERE p.bill_id = b.id) > 0;
    

    会成功的

    或者

    UPDATE bill b
    SET b.isPaid = 
              (SELECT count(*)
               FROM bill_payment p
               WHERE p.bill_id = b.id) > 0;
    

    如果你想更新每一行。

    【讨论】:

      【解决方案4】:

      您也可以使用UPDATE..JOIN..

      UPDATE bill b
      LEFT JOIN (SELECT bill_id FROM bill_payment GROUP BY bill_id) bp
       ON(bp.bill_id = b.id)
      SET b.isPaid = if(bp.bill_id IS NULL , 1 , 0 )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        • 2017-01-06
        • 2015-01-25
        • 1970-01-01
        相关资源
        最近更新 更多