这是MYSQL表架构:
+---------------+---------------------+
| username | last_activity_time |
+---------------+---------------------+
| raphael | 2011-11-28 23:16:34 |
| donatello | 2011-11-28 23:17:36 |
| michaelengelo | 2011-11-29 10:08:28 |
| raphael | 2011-11-29 11:11:33 |
| leonardo | 2011-11-29 11:12:30 |
+---------------+---------------------+
为每个活动插入一个包含用户名和last_activity_time的新记录。
查询要求:
选择在两个日期之间每天进行一些活动的所有用户,例如2011-11-20和2011-11-30(均包括在内)
“IN”查询似乎不是一个选项,因为它适用于IN数组中的任何值,而不是ALL。
答案 0 :(得分:1)
SELECT username, COUNT(*) AS nbr_day
FROM (
SELECT username, DATE(last_activity_time) AS last_activity_date
FROM my_table
WHERE ( last_activity_time >= @date1 )
AND ( last_activity_time < DATE_ADD( @date2, INTERVAL 1 DAY) )
GROUP BY username, last_activity_date
) AS sub
GROUP BY username
HAVING ( COUNT(*) = 1 + DATEDIFF(@date2, @date1) )
此查询计算每个用户名的不同天数。然后只保留这个数字等于两个日期之间天数的那些。
表达式“DATE_ADD(@ date2,INTERVAL 1 DAY)”表示@ date2之后的日期。它使用的是而不是@ date2,因为“last_activity_time”包含日期和时间。
答案 1 :(得分:0)
尝试使用BETWEEN
获取两个日期之间的数据。
SELECT username, mast_activity_time FROM table
WHERE last_activity_time BETWEEN "2011-11-20 00:00:00" AND "2011-11-30 23:59:59"
GROUP BY username, last_activity_time HAVING COUNT(last_activity_time) = 1
请注意,只有为每个新活动插入新条目时,此查询才有效。如果您只是更新表格中的条目,则无法检索您想要的内容,因为您之前的数据将从表格中删除。
要更好地理解,请检查HAVING
答案 2 :(得分:0)
如果您没有任何高级查询,则可以使用BETWEEN。 (链接:here)
并且你可以这样做:
SELECT username,last_activity_time FROM users WHERE last_activity_time BETWEEN 'date1' AND 'date2';
答案 3 :(得分:0)
尝试此查询
SELECT count(distinct date(last_activity_date)),username
FROM users
WHERE last_activity_date between start_Date and end_Date
group by user_id;
如果计数等于日期差异, 他们在两天之内每天至少登录一次