Как объединить две таблицы в операторе UPDATE? - PullRequest
7 голосов
/ 31 марта 2012

Рассмотрим следующие таблицы: «пользователи» и «твиты»

user_id name             tweet_id user_id tweet        spam
-----------------        ----------------------------------
1       SUSPENDED        1        1       lorem ipsum  0
2       foo              2        1       dolor        0
3       bar              3        2       samet        0
4       SUSPENDED        4        1       stunitas     0
                         5        3       hello        0
                         6        4       spamzz!      0

Я хочу обновить таблицу «твиты», пометив все твиты, сделанные пользователями SUSPENDED, как спам.Таким образом, в приведенном выше примере твиты с tweet_id 1, 2, 4 и 6 будут помечены как спам при обновлении значения «спам» с 0 до 1.

У меня возникли проблемы при объединении двух таблиц.До сих пор мне приходилось только присоединяться к операторам SELECT, но это кажется более проблематичным:

UPDATE tweets SET spam = 1 WHERE tweets.user_id = users.user_id 
AND users.name = 'SUSPENDED'

Это, безусловно, не работает ... кто мог бы указать мне правильное направление?

Ответы [ 4 ]

24 голосов
/ 31 марта 2012

Вы на правильном пути, но вам нужно указать JOIN между таблицами:

UPDATE tweets JOIN users ON tweets.user_id = users.user_id
  SET tweets.spam = 1
WHERE users.name = 'SUSPENDED'
2 голосов
/ 31 марта 2012

Это должно сделать это:

UPDATE tweets
INNER JOIN users ON (users.user_id = tweets.user_id)
SET spam=1
WHERE users.name='SUSPENDED'

Обычно вы можете использовать JOIN в UPDATE то же самое, что и в SELECT.Вы не сможете присоединить таблицу к себе в UPDATE, и есть некоторые другие маленькие причуды, но для базовых вещей, подобных этой, это будет работать так, как вы ожидаете.

0 голосов
/ 19 июля 2018

Предположим, у вас есть 3 таблицы, и вам нужно обновить один столбец из одного table другим table.Есть несколько способов сделать это.Пожалуйста, посмотрите на это query например.

update Table1 T1, Table2 T2, Table3 T3 set T1.field_name = T3.field_name where (T1.field_name = T2.field_user_name) and (T2.field_id = T3.entity_id);

Необходимо тщательно соблюдать соотношение между tables.

0 голосов
/ 31 марта 2012

Начал отвечать перед проверкой типа используемого вами сервера.Я знаю, что это работает в MS SQL Server.Однако я не уверен насчет MySQL.MySQL не установлен, поэтому попробуйте.

UPDATE tweets SET
  spam = 1
FROM tweets INNER JOIN users ON users.user_id = tweets.user_id
WHERE users.name = 'SUSPENDED'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...