MySQL UPDATE的正确语法... JOIN ... CASE?

时间:2012-02-08 13:48:24

标签: mysql join case

我无法弄清楚如何使用CASE和JOIN进行更新。这个例子来自我的Drupal数据库。 content_typenid为主键;另一方面,term_node可以有多个行,其中nid与不同的tid匹配。 MySQL将很乐意根据WHERE解析查询:

UPDATE `content_type`
LEFT JOIN `term_node` USING(nid)
 SET
  `field_m03` = 1
   WHERE tid = 696;

以上内容更新了content_typenid(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);

在没有括号和单引号的情况下也尝试过,没有变化。

3 个答案:

答案 0 :(得分:1)

我不知道为什么它不起作用的答案,但我建议你再考虑一下。

您的UPDATE需要全表扫描。单个更新可以使用索引,前提是给定的tid只是实际存在的tid的一小部分。

因此,发布单个UPDATE可能更容易,也更便宜,或者至少使用

来限制UPDATE的范围
... WHERE tid BETWEEN 696 AND 700

答案 1 :(得分:1)

您的语法似乎正确。

如果您的MySQL服务器已启用安全更新(SQL_SAFE_UPDATES),那么您的服务器将中止任何没有WHERELIMIT条款的更新。

答案 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);