MySQL group by仅对特定数量的记录进行分组(在联接表达式中进行查询)
我有一个历史记录表,它表示由某种聊天程序存储的消息 它有一个用户id、消息和日期时间。(指定日期:) 现在,我想要的是得到一个包含以下内容的结果:MySQL group by仅对特定数量的记录进行分组(在联接表达式中进行查询),mysql,Mysql,我有一个历史记录表,它表示由某种聊天程序存储的消息 它有一个用户id、消息和日期时间。(指定日期:) 现在,我想要的是得到一个包含以下内容的结果: 按日期键入的最大邮件数 哪个用户的消息最多,以及该用户键入的消息数) 我让它工作,但我发现查询相当慢,我想这是因为最后一个GROUP BY(GROUP BY b.cnt),因为这将对找到的所有记录进行分组 查询: SELECT b.cnt as dayCount, a.cnt as userCount, a.userid as userId, b
- 按日期键入的最大邮件数
- 哪个用户的消息最多,以及该用户键入的消息数)
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;
有人能给我建议如何解决这个问题吗?也许再问一下
提前谢谢 看来你加入的标准是错误的 第一个表获取用户数,第二个表获取每个用户id的天数。请参阅
您可以尝试将
windows函数
与子查询
一起使用,以获得相同的结果
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
基于sqlfidle中的示例。。您还应该添加预期结果..是否使用索引?如果是,索引是什么?@scaisEdge:预期结果与小提琴上显示的结果完全相同,查询速度不快enough@DanIonescu:用户id上的历史记录和索引上有一个主键,那么您的问题只是关于如何提高性能???请确认感谢您的回复,但这不会得到发布邮件最多的正确用户id+userCount是该表的总计数,而不是该特定日期谢谢!我已经在研究分区了,但您更快地解决了它:)。(比我原来的查询快0.4秒)欢迎!很高兴我能帮忙:)
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