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.这将阻止执行全表扫描,这在大型数据库中非常慢.
添加INDEX表userstable:
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)