我有一个历史记录表,表示由某种聊天程序存储的消息。
它有一个用户 ID、消息和日期时间。 (指定于:http://sqlfiddle.com/#!9/49fcefb/5)
现在,我想要的是得到一个包含以下内容的结果:
- 按日期输入的最大消息数量
- 哪个用户拥有最多的消息以及该用户输入了多少条消息)
我成功了,但我发现查询相当慢,我认为这是因为最后一个 GROUP BY (GROUP BY b.cnt),因为这将对找到的所有记录进行分组。
查询:
SELECT b.cnt as dayCount, a.cnt as userCount, a.userid as userId, b.date
FROM (
select date_added as date, user_id as userid, count(*) as cnt from history group by userid, day(date_added),month(date_added),year(date_added)
) a
INNER JOIN (
select date_added as date, count(*) as cnt from history group by day(date_added),month(date_added),year(date_added)
) b ON year(a.date) = year(b.date)
AND month(a.date) = month(b.date)
AND day(a.date) = day(b.date)
GROUP BY b.cnt
ORDER BY dayCount desc, userCount desc limit 10;
有人可以建议我如何解决这个问题吗?也许使用另一种查询?
提前致谢!
最佳答案
您可以尝试将windows function
与Subquery
结合使用来获得相同的结果。
select SQ.daycount,SQ.usercount,SQ.user_id, SQ.date1 from (
select sum(count(Message)) over (partition by date(date_added)) as daycount, --to get max amount of msg by date
max(count(Message)) over (partition by date(date_added)) as maxuser, -- to identify user with most msg
count(Message) as usercount,
date(date_added) as date1,user_id from history
group by date1,user_id ) SQ
where SQ.usercount=SQ.maxuser
关于MySQL仅对特定数量的记录进行分组(在JOIN表达式中查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58620982/