我想实现这样的目标:
update bill b set b.isPaid = (if(select count(*) from bill_payment p where p.bill_id = b.id) > 0,true,false);
但是我收到了这个错误:
错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在res_bill_payment p(其中p.bill_id = b.id)的'select count(*)附近使用正确的语法> 0,真,假)'第1行
我怎么能在mySQL中做到这一点?
答案 0 :(得分:2)
我建议使用EXISTS
来写这个:
UPDATE bill b
SET b.isPaid = (EXISTS (SELECT 1
FROM bill_payment p
WHERE p.bill_id = b.id
)
);
EXISTS
子句返回一个布尔值,因此不需要显式使用TRUE
和FALSE
(除非你真的真的想要)。
我强烈建议您使用EXISTS
代替COUNT(*)
来实现此目的,因为它通常具有更好的性能。 EXISTS
可以在第一个匹配记录处停止,而不必计算所有匹配的记录。
答案 1 :(得分:1)
似乎你错过了一些括号:
UPDATE bill b
SET b.isPaid = (IF(
(
SELECT COUNT(*)
FROM bill_payment p
WHERE p.bill_id = b.id
) > 0
,TRUE
,FALSE
));
答案 2 :(得分:0)
For example, move data from
B2 to C1,
B4 to C3,
B6 to C5, and so on
会做的伎俩
或者
UPDATE bill b
SET b.isPaid = true
WHERE
(SELECT count(*)
FROM bill_payment p
WHERE p.bill_id = b.id) > 0;
如果您想要更新每一行。
答案 3 :(得分:0)
您也可以使用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 )