2017-02-04 78 views
0

我有一個表,用於存儲所有用戶連接(日期&IP),我想用單個查詢檢索所有用戶數據(暱稱,頭像...)+最後一條記錄我對這個用戶的聯繫人記錄表...選擇最後一條記錄mysql左加入

SELECT 
    * 
FROM 
    `users` 
     LEFT JOIN 
    `connections_history` ON `users`.`id` = `connections_history`.`guid` 

我怎樣才能繼續THX

+0

確實'connections_history'有一個AUTO_INCREMENT PK? –

回答

0

可惜Mysql不支持window功能,你需要Correlated sub-query做到這一點。

嘗試這樣的事情

SELECT * 
FROM users 
     LEFT JOIN connections_history ch 
       ON users.id = ch.guid 
       AND EXISTS (SELECT 1 
          FROM connections_history ch1 
          WHERE ch.guid = ch1.guid 
          HAVING Max(ch1.date) = ch.date) 
0

您可以在ON條款與相關子查詢做到這一點:

SELECT u.*, ch.* 
FROM `users` u LEFT JOIN 
    `connections_history` ch 
     ON ch.`guid` = u.`id` AND 
     ch.date = (SELECT MAX(ch2.date) 
        FROM connections_history ch2 
        WHERE ch.guid = ch2.guid 
        ); 

這種配方允許查詢到connections_history(guid, date)採取指數的優勢。

+0

@EvaldasBuinauskas。 。 。 *數據分析的第1章使用SQL和Excel *解釋了查詢格式背後的基本原理。請不要編輯我的查詢的格式。 –

0

一種方法是在子查詢中查找每個guid的最大日期的行,然後加入用戶表。

像這樣:

select * 
from `users` u 
left join (
    select * 
    from `connections_history` c 
    where date = (
     select max(date) 
     from `connections_history` c2 
     where c.`guid` = c2.`guid` 
    ) 
) t on u.`id` = t.`guid`; 
+1

不是一個不好的解決方案,但它意味着一個索引不能用於'LEFT JOIN'。 –

0

假設connections_history表中有一個AUTO_INCREMENT列id

SELECT * 
FROM (
    SELECT u.*, MAX(h.id) as hid 
    FROM users u 
    LEFT JOIN connections_history h ON u.id = h.guid 
    GROUP BY u.id 
) u 
LEFT JOIN connections_history h ON h.id = u.hid