我有一个表,其中包含所有用户的每次登录。我想运行一个查询,该查询将提取每个用户登录的次数,但如果用户一天登录超过4次,则将其限制为4次。然后求和以获得总登录次数。此外,我想拉回来的总登录次数的时间框架。因此,我将总登录数指定为100,然后查询必须返回最早的日期,从今天开始计算每个用户的登录数(如果超过4,则限制为4)。
到目前为止,我的查询是获取每个用户限制为4个的总计列表:
SELECT (case when (count(l.user_id) > 4) then 4 else count(l.user_id) end) as cappedcount
FROM `logins` l
where l.store_id = 908
and l.login_dt > '2018-04-17 00:00:00' and l.login_dt < '2018-04-18 23:59:59'
group by l.user_id order by cappedcount desc
我现在正在指定日期范围,但不想在最终查询中这样做。
2条答案
按热度按时间iq3niunx1#
如果我理解正确,您只想查看每个用户和日期的最后四次登录,而忽略他们以前的登录。从这个集合中,您需要最后100次登录。
因此,第一个任务是获得每个用户和每一天的最后四次登录,这通常可以通过窗口函数来解决,但是mysql没有提供这些功能。因此,请改为在子查询中计数(这可能需要很长时间):
我建议为此查询提供以下索引:
b09cbbtk2#
您使用的mysql版本是什么?因为据我所知
with clause
仅在mysql的最新版本中受支持。我相信你第一个要求的答案是:
您可以在sqlfiddle.com中查看。
对于你的第二个问题,我有下面的答案,我相信这不是最好的解决方案,但它在MySQL5.6上工作。在下一个mysql版本(MySQL8)中,您可以使用with子句,它为这个问题提供了更好的解决方案。我在解决方案中使用视图跳过重复查询:
在这个sqlfiddle.com中找到解决方案,我刚刚将100改为10。