我想删除在指定时间段内没有登录的用户,但稍后会根据结果选择一段时间。
所以我需要一份报告,其中我将收到许多用户,这些用户在过去1个月,2个月...... n个月内没有登录。
我不太清楚如何在单个mysql查询中实现移动时段。
在给定时期内提取这些用户非常简单:
SELECT count(distinct id) from tmp_last_login
WHERE last_login <= DATE_SUB(now(), interval 1 month)
但是如何在n个月内实现这样的报告呢?
预期结果:
**interval** **cnt**
1 xxx
2 xxx
3 xxx
4 xxx
5 xxx
... xxx
n xxx
答案 0 :(得分:4)
以下查询将在distinct ids
的时间间隔内为each month difference
返回10 months from now
的计数。
SELECT
12 * (YEAR(CURDATE()) - YEAR(last_login)) + (MONTH(CURDATE()) - MONTH(last_login)) AS months,
count(DISTINCT id) cnt
FROM
tmp_last_login
WHERE last_login >= DATE_SUB(CURDATE(), INTERVAL 10 MONTH)
GROUP BY months;
或强>
您也可以使用PERIOD_DIFF
功能。
SELECT
PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m'),DATE_FORMAT(last_login,'%Y%m')) AS months,
count(DISTINCT id) cnt
FROM
tmp_last_login
WHERE last_login >= DATE_SUB(CURDATE(), INTERVAL 10 MONTH)
GROUP BY months;
注意:
last_login
条目,则需要为每个用户找到maximum last login
个时间,然后做其余的事。
SELECT
PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m'),DATE_FORMAT(t.max_last_login,'%Y%m')) AS months,
count(t.id) cnt
FROM
(
SELECT
id,
MAX(last_login) max_last_login
FROM tmp_last_login
GROUP BY id
) AS t
WHERE t.max_last_login >= DATE_SUB(CURDATE(), INTERVAL 10 MONTH)
GROUP BY months;
答案 1 :(得分:1)
尝试:
SELECT
id,
((last_login - UNIX_TIMESTAMP()) / 2629743) monthsSinceLastLogin
FROM tmp_last_login
WHERE last_login - UNIX_TIMESTAMP() > 2629743
GROUP BY id
HAVING max(last_login) = last_login
假设:您正在使用以秒为单位计算的unix时间戳。 2629743是约。一个月之后。
使用GROUP BY和HAVING部分,您确保只选择最新的登录信息。 使用WHERE部分,您可以确保仅粉色至少一个月的记录。