使用另一个表的数据更新MySQL表

时间:2013-04-12 19:00:35

标签: mysql sql sql-update

我阅读thisthis,但我需要进行GROUP BY查询以设置另一个表。

logintable是这样的:

id | name    | login_date
------------------------
1  | michael | 2013-01-04 
2  | michael | 2013-01-08 
3  | mary    | 2013-01-11 
4  | john    | 2013-01-15 
5  | michael | 2013-01-19 
6  | mary    | 2013-01-22 
7  | john    | 2013-01-26 

我这样做一个查询:

SELECT * FROM logintable GROUP BY name ORDER BY id ASC

这为我提供了用户的第一个登录日期:

1  | michael | 2013-01-04 
3  | mary    | 2013-01-11 
4  | john    | 2013-01-15 

我有另一张名为userstable的表格,如下所示:

id | name    | last_seen_date | first_login_date
------------------------------------------------
1  | michael | 2013-02-02     |  
2  | john    | 2013-02-04     |   
3  | mary    | 2013-02-16     |  

我需要使用第一个结果更新userstable的first_login_date列。我怎样才能做到这一点 ? (我在登录表中有75k记录,在用户表中有10k记录)

4 个答案:

答案 0 :(得分:15)

UPDATE  userstable a
        INNER JOIN
        (
            SELECT  name, min(login_date) min_date
            FROM    logintable
            GROUP   BY name
        ) b ON a.name = b.Name
SET     a.first_login_table = b.min_date

为了提高性能,您需要在两个表的INDEX列上添加Name。这将阻止执行全表扫描,这在大型数据库中非常慢。

在表INDEX上添加userstable

ALTER TABLE usersTable ADD INDEX (Name);

对于参照完整性,通过定义logintable约束使表userstable依赖于表FOREIGN KEY

ALTER TABLE loginTable ADD CONSTRAINT tb_fk
FOREIGN KEY (Name) REFRENCES usersTable (Name)

答案 1 :(得分:4)

UPDATE userstable AS u
INNER JOIN
(
   SELECT MIN(login_date) AS MinLoginDate, Name
   FROM logintable 
   GROUP BY name
) AS l ON u.name = l.name
SET u.first_login_date = l.MinLoginDate

答案 2 :(得分:2)

我不知道MySql ...但是在SQL Server中你会写这样的东西:

UPDATE userstable set first_login_date = (SELECT MIN(login_date) FROM logintable where name = userstable.name)

答案 3 :(得分:0)

更新用户表a         内部联接         (             SELECT name,min(login_date)min_date             来自logintable             GROUP BY名称         )b ON a.name = b.Name SET a.first_login_table = b.min_date

这肯定会显示你的输出。