2012-02-08 4 views
2

Я нахожусь в убытке, чтобы выяснить, как сделать ОБНОВЛЕНИЕ с CASE и JOIN. Этот пример из моей базы данных Drupal. content_type имеет nid в качестве первичного ключа; term_node, с другой стороны, может иметь несколько строк с одинаковыми nid, соответствующих различным tid. MySQL будет благополучно разобрать запрос, основанный на том, где:Правильный синтаксис для MySQL UPDATE ... JOIN ... CASE?

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

В какой таблице находится поле_m03? –

+0

'field_m03' из таблицы' content_type' –

ответ

1

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

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

1

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

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

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

... WHERE tid BETWEEN 696 AND 700 

.

+0

Спасибо, что-то поставив предложение WHERE сделал работу с CASE ... –

+1

@Pedro, определенно проверьте мой ответ и настройку SQL_SAFE_UPDATES. –

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); 
+1

Определенно более читаемый с помощью псевдонимов, но это вряд ли решение. MySQL будет жаловаться, если имена полей были неоднозначными. –

Смежные вопросы