2015-09-25 2 views
-4

Мне нужно сделать запрос на обновление результата из 2-х табличных соединений. Эти две таблицы заключаются в соотношении n: n. Вот таблицы:SQL UPDATE в JOIN двух таблиц n: n

Таблица 1: Вкладка

*CITIES* [this is the table name] 
idcities (primary key) 
cityname 

Отношения:

*USER_HAS_CITIES* [this is the table name] 
user_iduser (foreign key) 
cities_idcities (foreign key) 

Таблица 2:

*USER* [this is the table name] 
iduser (primary key) 
username 
password 
name 
surname 

Например, мне нужно обновить "CITYNAME" (установив его в Лос-Анджелес), где user.iduser = 1 and cities.idcities = 2;

Как я могу это сделать?

+6

Отметьте свой вопрос в базе данных, которую вы фактически используете. MySQL и SQL Server - разные продукты. –

+0

Вы уверены, что хотите изменить название города с помощью фильтра 'user.iduser = 1'. Я думаю, что вы должны обновлять название города только по адресу 'cities.idcities = 2' – HAYMbl4

+0

Вы предлагаете обновить только одну таблицу (' city'). Это может изменить некоторые строки, связанные с присоединением «городов» к «пользователям» через 'user_has_cities', но это не очень хорошо описано как« обновление для соединения ». –

ответ

0

Независимо от того, какая СУБД вы используете это, будет выполнена так.

update USER_HAS_CITIES 
set cities_idcities = (select idcities from CITIES where cityname = 'Los Angeles') 
where user_iduser = 1 
+0

вы забыли.cities.idcities = 2' – HAYMbl4

+0

ОП запрашивает имя города для обновления. ваш запрос обновляет cities_idcities –

+0

Правильно, но если это то, что они действительно после того, как это не имеет значения, какой он есть, просто простое обновление таблицы городов сделает это. –

1

В MS SQL:

UPDATE c 
SET c.cityname = 'Los Angeles' 
FROM CITIES c 
INNER JOIN USER_HAS_CITIES u ON u.ities_idcities = c.idcities 
WHERE c.idcities = 2 AND u.iduser = 1 

В MySQL:

UPDATE CITIES c 
INNER JOIN USER_HAS_CITIES u ON u.ities_idcities = c.idcities AND c.idcities = 2 AND u.iduser = 1 
SET c.cityname = 'Los Angeles' 
+0

Присоединение к user_has_cities действительно бессмысленно здесь, если только они не хотят менять название города, если этот конкретный пользователь имеет этот город. Что-то не хватает из объяснения из OP наверняка. –

+0

Соединения могут быть быстрее, чем в операторах или коррелированных подзапросах. Там, где существует, также обычно быстрее. – HLGEM

0

Так как вы на самом деле предложит обновить только одну таблицу, вам не нужно никакого специального соуса:

UPDATE cities 
SET cityname = 'Los Angeles' 
WHERE idcities = 2 

Если вы хотите оговаривать обновление на wh эфиру данный город связан с данным пользователем, то вы можете добавить соответствующее условие в пункт WHERE:

AND EXISTS(
    SELECT 1 FROM user_has_cities WHERE user_iduser = 1 AND cities_idcities = 2) 

Если вы хотите обновить название города заданного пользователя (-я) на основе идентификатора пользователя , не зная город идентификатор, то вы можете сделать это:

UPDATE cities 
SET cityname = 'Los Angeles' 
WHERE idcities IN (
    SELECT cities_idcities FROM user_has_cities WHERE user_iduser = 1) 
1

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

Во-первых, если у вас есть таблица cities, не имеет смысла обновлять название города. Просто добавьте или удалите записи из списка по мере необходимости. Если вы должны обновить имя, это не займет соединение. Просто:

update cities set cityname = 'Los Angeles' where id = 2; 

То же самое относится и к users таблице. Не используйте соединение, просто:

update users set pwd = '1234' where id = 4; 

Единственную таблицу, которая заслуживает обновлений для этого вопроса является user_has_cities таблицей.

Итак, давайте предположим, что ваш user_has_cities таблицы имеет много: многие отношений, что есть много пользователей, и каждый из них имеет много городов, как в этом примере: http://sqlfiddle.com/#!9/f146b

Если вы знаете идентификатор города и пользователь, вы можете сделать простое обновление: http://sqlfiddle.com/#!9/8a420/1

update user_has_cities 
set idcities = 1 
where iduser = 5 
and idcities = 6; 

Если вы не знаете идентификатор города, но только имя, вы могли бы поставить select в вашей статье set, как это: http://sqlfiddle.com/#!9/0b1f3/1

update user_has_cities 
set idcities = (
    select id from cities where cityname = 'Los Angeles' limit 1 
) 
where iduser = 5 
and idcities = 6; 

Обязательно ограничьте возвращенные записи, или вы получите сообщение об ошибке, если более одного города имеют название «Лос-Анджелес». Это довольно отрывочный код в любом случае; гораздо лучше делать ваши обновления с помощью уникального идентификатора.

Если вы не знаете, идентификатор текущего города, вы могли бы теоретически расширить тему, как это: http://sqlfiddle.com/#!9/b28876/1

update user_has_cities 
set idcities = (
    select id from cities where cityname = 'Los Angeles' limit 1 
) 
where iduser = 5 
and idcities in (select id from cities where cityname = 'Huntington Beach'); 

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

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