检测至少1记录的存在,我有两个表:MySQL的:在大连接表
用户(ID,姓名)
user_activities(ID,USER_ID,ACTIVITY_ID,created_at)
的user_activities表非常大,有超过3亿行。
我正在尝试检测哪些用户在给定日期范围内完成了任何活动。换句话说,用户表上的行,在某个created_at范围内的user_activities表上存在联合行。
我可以用INNER JOIN,GROUP BY和WHERE子句做这件事,但查询运行了很长时间,因为我相信它在我的日期范围之间触及所有user_activities行。
我并不在乎“有多少”活动,就像他们已经超过零。所以我分组得到一个计数(例如210个活动),实际上我可以在找到1后停下来。
是否有更有效的方法来执行此操作,而不是将所有user_activity行分组来计数它们?
有关的信息,这里的当前查询,工作正常,但需要较长的时间:提前
SELECT u.id, u.name, COUNT(ua.id) AS activity_count
FROM users u
INNER JOIN user_activity ua ON u.id=ua.user_id
WHERE ua.created_at > '2017-01-01' AND ua.created_at < '2017-03-01'
GROUP BY u.id
HAVING activity_count > 0;
谢谢!
没有HAVING需要在这里,没有活动没有用户会包括在内。 (即,activity_count将总是大于0.) – jarlh
所以我可以删除COUNT(ua.id)呢? – infaddict
您是否需要对每个用户的活动进行计数,或者只需知道用户是否活动就足够了(即在日期范围内至少有一项活动)? –