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

tra*_*nte 3 mysql sql sql-update

我读了这个这个,但我需要进行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 
Run Code Online (Sandbox Code Playgroud)

我这样做一个查询:

SELECT * FROM logintable GROUP BY name ORDER BY id ASC
Run Code Online (Sandbox Code Playgroud)

这给了我用户的第一个登录日期:

1  | michael | 2013-01-04 
3  | mary    | 2013-01-11 
4  | john    | 2013-01-15 
Run Code Online (Sandbox Code Playgroud)

我有另一个这样的表userstable:

id | name    | last_seen_date | first_login_date
------------------------------------------------
1  | michael | 2013-02-02     |  
2  | john    | 2013-02-04     |   
3  | mary    | 2013-02-16     |  
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*Woo 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
Run Code Online (Sandbox Code Playgroud)

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

添加INDEXuserstable:

ALTER TABLE usersTable ADD INDEX (Name);
Run Code Online (Sandbox Code Playgroud)

对于引用完整性,通过定义约束使表logintable依赖于表:userstableFOREIGN KEY

ALTER TABLE loginTable ADD CONSTRAINT tb_fk
FOREIGN KEY (Name) REFRENCES usersTable (Name)
Run Code Online (Sandbox Code Playgroud)