MySQL在一个连接上只选择一条记录,不包括匹配项

MySQL在一个连接上只选择一条记录,不包括匹配项,mysql,join,Mysql,Join,我有一个查询,其中显示了用户列表及其上次登录日期。如果他们有登录历史记录,它就可以工作,但是如果他们没有登录历史记录,它就不包括他们。即使没有登录历史记录,如何让所有用户显示 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 = "gro

我有一个查询,其中显示了用户列表及其上次登录日期。如果他们有登录历史记录,它就可以工作,但是如果他们没有登录历史记录,它就不包括他们。即使没有登录历史记录,如何让所有用户显示

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个用户


谢谢您的帮助。

您使用左连接的想法是正确的,但我认为您可以稍微简化子查询

未经测试,但请尝试以下方法:

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

(如果速度非常慢,对登录日期和用户id的日志登录进行索引应该会对子查询有很大帮助!)

使用左连接的想法是正确的,但我认为可以稍微简化子查询

未经测试,但请尝试以下方法:

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

(如果速度非常慢,对登录日期和用户id的日志登录进行索引应该会对子查询有很大帮助!)

更改您的
分组依据
——您希望按照
种植者.id
进行分组,而不是
ld2.user\u id
,因为ld2.user\u 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

更改您的
分组依据
——您希望按照
种植者.id
而不是
ld2.user\u id
进行分组,因为ld2.user\u 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

你需要一个左
外部连接。单独使用左连接没有什么错。。。是否返回单个空记录?尝试返回growers.id而不是ld2.id.@BobFincheimer LEFT OUTER join没有更改查询结果。@Danny--也不应该--它们是相同的。尝试按growers.id而不是user_id…@sgedes进行分组。谢谢我会接受答案,只要它让我还有一段等待时间。你需要一个左
外部
连接。单独使用左连接没有什么错。。。是否返回单个空记录?尝试返回growers.id而不是ld2.id.@BobFincheimer LEFT OUTER join没有更改查询结果。@Danny--也不应该--它们是相同的。尝试按growers.id而不是user_id…@sgedes进行分组。谢谢我会接受答案,一旦它让我还有一段等待期。