2015-09-25 45 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'); 

我并不了解这个问题,所以我不知道知道这是否可以解决问题,但我希望这有助于您指出正确的方向。