简体   繁体   English

使用if条件基于子查询更新表

[英]Update table based on subquery with if condition

I want to achieve something like this: 我想实现以下目标:

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

but I get this error: 但是我得到这个错误:

ERROR 1064 (42000): You have an error in your SQL syntax; 错误1064(42000):您的SQL语法有错误; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select count(*) from res_bill_payment p where p.bill_id = b.id) > 0,true,false)' at line 1 在第1行上,检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在'res_bill_payment p中选择count(*),其中p.bill_id = b.id)> 0,true,false)附近使用

How can I do it in mySQL? 如何在mySQL中执行此操作?

I would suggest writing this using EXISTS : 我建议使用EXISTS编写此代码:

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

The EXISTS clause returns a boolean, so there is no need to explicitly use TRUE and FALSE (unless you really, really want to). EXISTS子句返回一个布尔值,因此无需显式使用TRUEFALSE (除非您确实非常希望使用)。

I strongly recommend using EXISTS instead of COUNT(*) for this purpose, because it often has much better performance. 我强烈建议为此目的使用EXISTS而不是COUNT(*) ,因为它通常具有更好的性能。 EXISTS can stop at the first matching record, instead of having to count all matching records. EXISTS可以在第一个匹配记录处停止,而不必计算所有匹配记录。

Seems you are missing some parenthesis: 似乎您缺少一些括号:

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

Would do the trick 会做到的

Or 要么

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

If you want to update EVERY row. 如果要更新每行。

You can also do it with UPDATE..JOIN.. : 您也可以使用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 )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM