Mysql 选择所有非活动用户的Sql查询

Mysql 选择所有非活动用户的Sql查询,mysql,sql,Mysql,Sql,我要实现一个查询 我有两个表:用户和登录日志表 用户表如下所示: id|124;名字|姓氏|电子邮件|用户名|已激活|已暂停 1 | |约翰| |丹| |john@whatever||约翰1 | 1 | 0 | 2 | |迈克| |赫特| |mike@whatever||mike1 | 1 | 0 | 等等 登录日志表如下所示: id|登录|日期时间| |用户| id 2011-01-27 23:04:59 2010-01-27 23:04:59 等等 因此,login\u logs表记录用户何

我要实现一个查询

我有两个表:用户登录日志

用户表如下所示:

id|124;名字|姓氏|电子邮件|用户名|已激活|已暂停

1 | |约翰| |丹| |john@whatever||约翰1 | 1 | 0 |

2 | |迈克| |赫特| |mike@whatever||mike1 | 1 | 0 |

等等

登录日志表如下所示:

id|
登录|日期时间| |用户| id

2011-01-27 23:04:59

2010-01-27 23:04:59

等等

因此,login\u logs表记录用户何时登录

现在我想做一个选择所有非活动用户的查询。非活跃用户包括:

1) 90天未登录的用户

2) 从未登录的用户

我提出了一个满足第一个条件但不完全正确的查询:

 SELECT DISTINCT u.id, u.last_name, u.first_name, u.email,u.username

 FROM users u INNER JOIN login_logs l ON l.user_id = u.id 

 WHERE u.activated = 1 AND u.suspended = 0  AND DATEDIFF(CURDATE(), l.login_datetime) <= 90

 ORDER BY u.last_name, u.first_name, u.id
选择不同的u.id、u.last\u name、u.first\u name、u.email、u.username
从用户u内部连接登录\在l.user\u id=u.id上记录l

其中u.activated=1和u.suspended=0,DATEDIFF(CURDATE(),l.login\u datetime)首先,您的查询需要包括所有用户,因此将其转到左连接

接下来,您的查询需要使用GROUPBY来获取每个用户的最大登录时间

第三,不要将日期函数放在一个列上——这无助于提高性能,而是索引日期列并构造一个要测试的日期

SELECT u.id, u.last_name, u.first_name, u.email, u.username
FROM users u
LEFT JOIN login_logs l ON l.user_id = u.id
WHERE u.activated = 1 AND u.suspended = 0
GROUP BY u.id, u.last_name, u.first_name, u.email, u.username
HAVING IFNULL(max(l.login_datetime), 0) <= ADDDATE(CURDATE(), interval -90 day)
ORDER BY u.last_name, u.first_name, u.id
选择u.id、u.last\u name、u.first\u name、u.email、u.username
来自用户u
左连接登录\u在l.user\u id=u.id上记录l
其中u.activated=1,u.suspended=0
按u.id、u.last_姓名、u.first_姓名、u.email、u.username分组
具有IFNULL(max(l.login\u datetime),0)
从用户u左外部连接登录l中选择u.*
on u.id=l.user\u id
其中,l.user\u id为空

或DATEDIFF(CURDATE(),l.login\u datetime)如果同一用户在过去90天内登录超过一次,则会多次选择该用户。谢谢Sachin!现在它选择从未登录过的用户。。但是,如果我很久以前就登录了,但最近它又把我当作一个非活动用户,因为它看到我很久以前就登录了,那该怎么办呢?我认为它工作得很好!非常感谢你的网络维基!虽然我必须研究这个查询,因为我不知道having子句!谢谢
select u.* from user u left outer join login l
on u.id = l.user_id
where l.user_id is null
or DATEDIFF(CURDATE(), l.login_datetime) <= 90