Правильный синтаксис для MySQL UPDATE ... JOIN ... CASE? - PullRequest
2 голосов
/ 08 февраля 2012

Я затрудняюсь понять, как сделать ОБНОВЛЕНИЕ с помощью 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);

Также пробовали без скобок и одинарных кавычек, без изменений.

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Ваш синтаксис кажется правильным.

Если на вашем сервере MySQL включены безопасные обновления ( SQL_SAFE_UPDATES ), тогда ваш сервер прервет все обновления, для которых нет условия WHERE или LIMIT.

1 голос
/ 08 февраля 2012

Я не знаю ответа, почему он не работает, но я хотел бы предложить вам еще раз подумать.

Для вашего UPDATE потребуется полное сканирование таблицы.Одиночные обновления могут использовать индексы, при условии, что данные tid s являются лишь небольшим набором из tid s, реально присутствующих.

Так что может быть проще и дешевле выдавать одиночные UPDATE s, либопо крайней мере, ограничьте диапазон UPDATE с помощью

... WHERE tid BETWEEN 696 AND 700

.

0 голосов
/ 08 февраля 2012

как насчет использования 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);
...