我阅读this和this,但我需要进行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记录)
答案 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
这肯定会显示你的输出。