我无法弄清楚如何使用CASE和JOIN进行更新。这个例子来自我的Drupal数据库。 content_type
以nid
为主键;另一方面,term_node
可以有多个行,其中nid
与不同的tid
匹配。 MySQL将很乐意根据WHERE解析查询:
UPDATE `content_type`
LEFT JOIN `term_node` USING(nid)
SET
`field_m03` = 1
WHERE tid = 696;
以上内容更新了content_type
中nid
与(tid = 696)
匹配term_node
的所有行。
但是当我尝试使用CASE将几个条件串起来时,它将无法工作。没有错误,但影响了0行:
UPDATE `content_type`
LEFT JOIN `term_node` USING(nid)
SET
`field_m03` = (CASE
WHEN (tid = '696') THEN '1'
WHEN (tid = '697') THEN '2'
WHEN (tid = '698') THEN '3'
WHEN (tid = '699') THEN '4'
WHEN (tid = '700') THEN '5'
ELSE `field_m03`
END);
在没有括号和单引号的情况下也尝试过,没有变化。
答案 0 :(得分:1)
我不知道为什么它不起作用的答案,但我建议你再考虑一下。
您的UPDATE
需要全表扫描。单个更新可以使用索引,前提是给定的tid
只是实际存在的tid
的一小部分。
因此,发布单个UPDATE
可能更容易,也更便宜,或者至少使用
UPDATE
的范围
... WHERE tid BETWEEN 696 AND 700
答案 1 :(得分:1)
您的语法似乎正确。
如果您的MySQL服务器已启用安全更新(SQL_SAFE_UPDATES),那么您的服务器将中止任何没有WHERE
或LIMIT
条款的更新。
答案 2 :(得分:0)
如何在表格中使用ALIAS
?
UPDATE `content_type` a
LEFT JOIN `term_node` b USING(nid)
SET
a.`field_m03` = (CASE
WHEN (b.tid = '696') THEN '1'
WHEN (b.tid = '697') THEN '2'
WHEN (b.tid = '698') THEN '3'
WHEN (b.tid = '699') THEN '4'
WHEN (b.tid = '700') THEN '5'
ELSE a.`field_m03`
END);