MySQL - 基于时间顺序更新表

时间:2014-05-15 10:10:41

标签: mysql sql join

我有两张表格如下:

日志

id | user   | log_id
---------------------
1  | user1  | abc 
2  | user2  | def 
3  | user1  | xyz 
...

用户

id | user   | code
---------------
1  | user1  | 1234
2  | user2  | 9876
3  | user1  | 5678
...

我想将log_id添加到users并使用Table1中的log_id更新它,以使Table2如下所示:

id | user  | code   | log_id
---------------------------
1  | user1 | 1234   | abc
2  | user2 | 9876   | def
3  | user1 | 5678   | xyz    
...

匹配日志和用户中行的唯一方法是使用用户字段,以及它们在表中显示的时间顺序。正如您可能已经猜到的那样,id是两个表中的主键。

非常感谢有人可以帮我解决此问题。感谢。

4 个答案:

答案 0 :(得分:1)

如果id字段始终匹配,那么Ronak Shah的回复将是我的选择。

如果id不匹配,则可能是这样的: -

首先: -

ALTER TABLE table1 ADD COLUMN code VARCHAR(25);

然后是这样的更新: -

UPDATE table2
INNER JOIN
(
    SELECT id, user, code, @rank2:=IF(@prev_user2 = user, @rank2+1, 1) AS rank, @prev_user2 := user
    FROM table2
    CROSS JOIN (SELECT @rank2:=0, @prev_user2:='') sub2
    ORDER BY user, id
) tab_2
ON table2.id = tab_2.id
INNER JOIN
(
    SELECT id, user, log_id, @rank1:=IF(@prev_user1 = user, @rank1+1, 1) AS rank, @prev_user1 = user
    FROM table1
    CROSS JOIN (SELECT @rank1:=0, @prev_user1:='') sub1
    ORDER BY user, id
) tab_1
ON tab_1.user = tab_2.user
AND tab_1.rank = tab_2.rank
SET table2.log_id = tab_1.log_id;

这是一对子查询,它为每个表记录添加了一个排名(我已经在用户中添加了排名,如果一个表上的一个用户有额外的记录,这应该会更好地应对) 。这些子查询的结果连接在一起,然后连接到table2进行实际更新(table2的子查询可以根据id连接到table2)。

这在SQL小提琴中完成时似乎有用: -

http://www.sqlfiddle.com/#!2/ad8a6b/1

答案 1 :(得分:0)

试试这个:

UPDATE dbo.Table2 A
SET A.log_id = B.log_id
INNER JOIN dbo.Table1 B
ON A.user = B.user

但首先你必须使用alter query将log_id列添加到table2。

答案 2 :(得分:0)

试试这个:

alter table table1 add column code varchar(100);

update table1,table2 set table1.code = table2.code where table1.id=table2.id and table1.user=table2.user;

答案 3 :(得分:0)

我找到了解决方案。我在两个表中添加了2列rankprev_user,并将rank的值从user_x的第一条记录的1增加到user_x的第n条记录的n,如下所示: / p>

ALTER TABLE users ADD COLUMN rank tinyInt(1);
ALTER TABLE users ADD COLUMN prevuser varchar(50);
SET @prevuser = '';
SET @rank = 0;
UPDATE users 
SET rank = (@rank:=IF(@prevuser != user,1,@rank+1)),
    prevuser = (@prevuser := user)
ORDER BY user,id;
ALTER TABLE users DROP COLUMN prevuser;

ALTER TABLE logs ADD COLUMN rank tinyInt(1);
ALTER TABLE logs ADD COLUMN prevuser varchar(50);
SET @prevuser = '';
SET @rank = 0;
UPDATE logs 
SET rank = (@rank:=IF(@prevuser != user,1,@rank+1)),
    prevuser = (@prevuser := user)
ORDER BY user,id;
ALTER TABLE logs DROP COLUMN prevuser;

现在可以使用user& rank。我将字段log_id添加到users并将其更新如下:

UPDATE users, logs SET users.log_id=logs.log_id WHERE users.user=logs.user AND users.rank = logs.rank;

瞧!