3

我读了这个这个,但我需要做一个 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     |  

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

4

4 回答 4

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

为了获得更快的性能,您需要为两个表添加一个INDEXon 列Name。这将防止执行在大型数据库中非常慢的全表扫描。

添加INDEX在桌子上userstable

ALTER TABLE usersTable ADD INDEX (Name);

为了参照完整性,通过定义约束使表logintable依赖于表:userstableFOREIGN KEY

ALTER TABLE loginTable ADD CONSTRAINT tb_fk
FOREIGN KEY (Name) REFRENCES usersTable (Name)
于 2013-04-12T19:02:48.993 回答
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
于 2013-04-12T19:02:45.870 回答
2

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

UPDATE userstable set first_login_date = (SELECT MIN(login_date) FROM logintable where name = userstable.name)
于 2013-04-12T19:09:12.223 回答
0

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

这肯定会显示您的输出。

于 2014-03-05T10:56:07.597 回答