MYSQL:根据另一个表中的SELECT更新行


MYSQL: UPDATE rows based on SELECT from another table

我有一个"users"表,其中有100个条目,每个条目都有一个空的"first_name"列。我想用另一张表中的名字来更新每一个。它们不需要对应,可以是随机的,我只需要从一个表到另一个表的数据。我发现其他人也在问类似的问题,但他们似乎都有相应的列,比如"username"在任何一个表中都是相同的,并且可以使用JOIN ON使其工作。由于没有相应的列我无法做到这一点。

我目前已经尝试了以下不起作用:

UPDATE users
SET first_name =
  (
   SELECT `user_firstname`
   FROM past_users
   WHERE `active` = '1' LIMIT 100
  )

这给出了错误:

Subquery returns more than 1 row

它的唯一工作方式是使用LIMIT 1,它用相同的数据更新每个条目。我希望他们每个都是独一无二的。

好吧,也许是这个概念。下面只是一个例子。使用随机,并且限制为1。

架构

create table user
(   userId int auto_increment primary key,
    firstName varchar(50) not null
    -- etc
);
create table prevUser
(   userId int auto_increment primary key,
    firstName varchar(50) not null,
    active int not null
);
-- truncate table user;
-- truncate table prevuser;
insert user(firstName) values (''),(''),(''),(''),(''),(''),(''),(''),('');
insert prevUser(firstName,active) values 
('user1prev',0),('snickers bar',1),('Stanley',1),('user4prev',0),('zinc',1),
('pluto',1),('us7545rev',0),('uffallfev',0),('user4prev',0),('tuna',1),
('Monty Python',1),('us4 tprev',0),('mouse',1),('user4prev',0),('Sir Robin',1),
('lizard',1),('Knights that says, Nee!',0),('mayo',1),('656user4prev',0),('kiwi',1);

查询(与您的查询类似)

UPDATE user
SET firstName =
  (
   SELECT firstName
   FROM prevUser
   WHERE `active` = '1'
   order by rand()
   limit 1
  )

结果

select * from user;
+--------+--------------+
| userId | firstName    |
+--------+--------------+
|      1 | snickers bar |
|      2 | tuna         |
|      3 | mouse        |
|      4 | Sir Robin    |
|      5 | mouse        |
|      6 | mayo         |
|      7 | lizard       |
|      8 | snickers bar |
|      9 | pluto        |
+--------+--------------+

您需要这样的东西:

UPDATE users 
JOIN past_users ON past_users.user_id = users.id AND past_users.`active` = '1'
SET users.first_name = past_users.user_firstname