2014-10-16 26 views
0

我无法得到这个查询在MySQL工作:如何用查询结果更新单个列的值?

UPDATE proyects_c 
    SET director=(SELECT users.keyid 
        FROM users,proyects 
        WHERE users.username=proyects.director 
       ); 

现在的问题是,子查询返回不止一行。事情是,这是我想要的。它返回的行数与proyects_c中的行数相同,因此我期望这样做是使用查询结果更新列导向器中的每一行。

但是我得到的错误:

ERROR 1242 (21000) at line 23: Subquery returns more than 1 row 

这是有道理的,但我不能让它做我想做的。我究竟做错了什么?

作为第二个问题,我如何将它分解为两个查询?为了清楚起见。

+0

如果users.keyid返回多个值会怎么样?错误本身就是这样说的。 – AK47 2014-10-16 10:06:55

+0

你想要它做什么? – Strawberry 2014-10-16 10:11:11

+0

选中此项。 http://stackoverflow.com/questions/15209414/mysql-update-join – Aravind 2014-10-16 10:14:02

回答

1

也许这样的事情:

update proyects_c p 
inner join users u on 
    u.username = p.director 
set p.director = u.keyid 
0

您需要选择指定“顶部1”,在T-SQL,或“LIMIT 1”(如果没有记错)在MySQL中只返回一行。

尝试(假定T-SQL):

UPDATE proyects_c SET director=(SELECT TOP 1 users.keyid FROM users,proyects WHERE users.username=proyects.director); 
0

我做了绕开的问题。这个想法是奥斯卡·佩雷斯给我的。我所做的是向proyects_c(admin_id)添加一列。一旦完成,这是我使用的查询:

UPDATE proyects_c, users SET proyects_c.admin_id=users.keyid WHERE proyects_c.director=users.username; 

这做了我想要的。之后,我删除了导演专栏,并将其更名为导演。我想要做的是将director的类型从一个字符串更改为一个int,并添加来自user.keyid的int值,该值与原来在director中的名称(字符串)相对应。所以这对我有效。奥斯卡让我意识到,我想要修改的行与查询结果中的行之间的唯一关系就是位置。我是这样做的,以致两个不同领域的关系是等价的。谢谢您的帮助。