我有两张表格如下:
日志
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
是两个表中的主键。
非常感谢有人可以帮我解决此问题。感谢。
答案 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小提琴中完成时似乎有用: -
答案 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列rank
和prev_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;
瞧!