2013-05-30 96 views
1

我有一個查詢,顯示用戶列表和他們的最後登錄日期。它適用於「如果」他們有登錄歷史,但如果他們沒有登錄歷史記錄,則不包括他們。即使他們沒有登錄歷史記錄,我如何讓所有用戶顯示?MySQL僅選擇一條記錄加入,包括不匹配

SELECT SQL_CALC_FOUND_ROWS growers.*,ld2.ip,ld2.login_date as last_login 
FROM growers 
LEFT JOIN ( 
    SELECT * 
    FROM log_logins 
    WHERE user_type = "grower" 
    ORDER BY login_date DESC 
    ) 
as ld2 ON (ld2.user_id = growers.id) 
GROUP BY user_id 
ORDER BY growers.id DESC 

我雖然「左」連接將包括他們,即使連接不匹配任何東西,但它沒有。另一件我不明白的事情是,當我刪除所有日誌記錄時,這個查詢總是返回1個用戶?

感謝您的幫助。

+0

你需要一個左'OUTER'加入。 –

+0

自己使用LEFT JOIN沒有錯......您是否返回單個NULL記錄?嘗試返回growers.id而不是ld2.id. – sgeddes

+0

@BobFincheimer LEFT OUTER join沒有改變查詢的結果。 – Danny

回答

1

更改GROUP BY - 你想要分組growers.id而不是ld2.user_id,因爲ld2.user_id可能是NULL

SELECT SQL_CALC_FOUND_ROWS growers.*,ld2.ip,ld2.login_date as last_login 
FROM growers 
    LEFT JOIN ( 
     SELECT * 
     FROM log_logins 
     WHERE user_type = "grower" 
     ORDER BY login_date DESC 
    ) 
    as ld2 ON (ld2.user_id = growers.id) 
GROUP BY growers.id 
ORDER BY growers.id DESC 
0

你有正確的想法使用LEFT JOIN,但我認爲你可以簡化子查詢一點。

未經檢驗的,但試試這個:

SELECT SQL_CALC_FOUND_ROWS growers.*,ld2.ip, ld2.login_date as last_login 
FROM growers 
LEFT JOIN log_logins ld2 ON (user_id = growers.id) 
WHERE ld2.login_date = (SELECT MAX(login_date) FROM log_logins WHERE user_id = ld2.user_id) 
GROUP BY user_id 
ORDER BY growers.id DESC 

(!如果它是非常緩慢的,在兩個login_date和user_id的索引log_logins應該幫助了很多與子查詢)