2015-09-25 75 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 

例如,我需要更新 「城市名」(設置它到洛杉磯)其中user.iduser = 1 and cities.idcities = 2;

我該怎麼做?

+6

用你實際使用的數據庫標記你的問題。 MySQL和SQL Server是不同的產品。 –

+0

您確定要用'user.iduser = 1'過濾更改城市名稱。我認爲你應該只通過'cities.idcities = 2'更新城市名稱 – HAYMbl4

+0

你只是建議更新一個表格('城市')。這可能會改變通過'user_has_cities'將'cities'加入'users'所產生的一些行,但它不能很好地描述爲「加入更新」。 –

回答

0

無論您使用哪種DBMS,都可以這樣完成。

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

OP要求更新cityname。您的查詢更新爲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如果基於用戶ID要更新給定用戶的城市(-ies)名稱

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

:乙醚給定城市與給定用戶,那麼你可以添加適當的條件向WHERE條款,不知道這個城市的ID,那麼你可以這樣做:

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; 

表也是如此。不要使用加入,只是:

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

唯一的表,值得對這個問題的更新是user_has_cities表。

因此,讓我們假設你的user_has_cities表有很多:很多關係,即有許多用戶,每個人都有許多城市就像這個例子:http://sqlfiddle.com/#!9/f146b

如果你瞭解這個城市和的id用戶,你可以做一個簡單的更新:http://sqlfiddle.com/#!9/8a420/1

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

如果你不知道這個城市的ID,但只是名字,你可以把一個selectset條款是這樣的: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; 

確保限制返回的記錄,否則如果不止一個城市的名稱爲「洛杉磯」,則會出現錯誤。無論如何,這是非常粗略的代碼。使用唯一ID進行更新會更好。

如果你不知道當前城市的ID,你可以在理論上擴大這樣的主題: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'); 

我並不瞭解這個問題,所以我不知道知道這是否可以解決問題,但我希望這有助於您指出正確的方向。