2013-04-12 40 views
3

我讀thisthis,但我需要做一個GROUP BY查詢來設置另一個表。更新MySQL表與另一個表的數據

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記錄logintable和10K記錄userstable)

+0

你的意思是像INSERT ... SELECT,UPDATE除外?你應該更新一個JOIN或兩個。 –

+1

這並不能保證給你第一個登錄日期。改用'MIN(login_date)'。 –

回答

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 

獲得更快的性能,你需要在Name列中添加INDEX兩個表。這將使阻止執行全表掃描,這在大型數據庫中非常緩慢。

上表userstable添加INDEX

ALTER TABLE usersTable ADD INDEX (Name); 

參照完整性,使表logintable依賴於表userstable定義FOREIGN KEY約束:

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

還有一件事請。如果我想在列記錄爲NULL的情況下設置「first_login_table」列,該怎麼辦?我可以在查詢結尾添加「WHERE a.first_login_table NOT NULL」嗎? – trante

+0

只有當列爲空時,才添加'WHERE a.first_login_table IS NULL'來設置 –

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

我不知道MySQL的,但在SQL Server中,你會這樣寫:

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

UPDATE userstable一個 INNER JOIN ( SELECT姓名,分鐘(login_date)MIN_DATE FROM logintable GROUP BY名稱 )B關於a.name = b.Name SET a.first_login_table = b.min_date

這一定會顯示你的輸出。