2013-05-30 97 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应该帮助了很多与子查询)