Вопрос:

Как обновить синтаксис с несколькими таблицами?

mysql resultset chaining

419 просмотра

3 ответа

3583 Репутация автора

Как я могу использовать результат SELECTдля определения полей, измененных в последующем UPDATE. (Эффективно связывает SELECT с последующим ОБНОВЛЕНИЕМ в составном операторе).

Вот что я пытаюсь сделать в SQL:

SELECT id_of_record_in_table_B 
FROM table_A 
WHERE table_A.id_of_record_in_table_B = 36;

UPDATE table_B SET string_field = 'UPPERCASE' 
WHERE BINARY table_B.string_field LIKE '%lowercase' 
AND table_B.id = id_of_record_in_table_B --from the SELECT above)

Чувствительное к регистру совпадение не имеет отношения к проблеме, но я включил его, потому что это именно то, что мне нужно сделать. Проблема, которую я пытаюсь решить, состоит в том, как «передать» значение, возвращаемое из SELECTв UPDATE.

Автор: therobyouknow Источник Размещён: 25.01.2012 06:10

Ответы (3)


1 плюс

2912 Репутация автора

Решение

Вы можете сделать это в том же запросе, например:

UPDATE table_B SET string_field = 'UPPERCASE' 
WHERE BINARY table_B.string_field LIKE '%lowercase' 
AND table_b.id = (SELECT id_of_record_in_table_B 
                  FROM table_A 
                  WHERE table_A.id_of_record_in_table_B = 36)
Автор: Kypros Размещён: 25.01.2012 06:17

1 плюс

5719 Репутация автора

Это можно назвать update with multi tableсинтаксисом, что позволяет избежать подзапроса. Единственная проблема с этим синтаксисом - вы не можете использовать предложение order by и limit

 UPDATE table_B as tb,table_A as ta 
 SET tb.string_field = 'UPPERCASE'  

 WHERE BINARY tb.string_field LIKE '%lowercase' 
 AND tb.id = id_of_record_in_table_B
 AND tA.id_of_record_in_table_B = 36
Автор: Angelin Nadar Размещён: 25.01.2012 07:42

0 плюса

2171 Репутация автора

Вы можете использовать вложенный оператор выбора.

UPDATE table_B SET string_field = 'UPPERCASE' 
WHERE BINARY table_B.string_field LIKE '%lowercase' 
AND table_B.id IN (SELECT id_of_record_in_table_B 
                   FROM table_A 
                   WHERE table_A.id_of_record_in_table_B = 36);
Автор: Freek Wiekmeijer Размещён: 27.01.2012 09:44
Вопросы из категории :
32x32