MySQL group by仅对特定数量的记录进行分组(在联接表达式中进行查询)

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

我有一个历史记录表,它表示由某种聊天程序存储的消息

它有一个用户id、消息和日期时间。(指定日期:)

现在,我想要的是得到一个包含以下内容的结果:

  • 按日期键入的最大邮件数
  • 哪个用户的消息最多,以及该用户键入的消息数)
我让它工作,但我发现查询相当慢,我想这是因为最后一个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;
有人能给我建议如何解决这个问题吗?也许再问一下


提前谢谢

看来你加入的标准是错误的

第一个表获取用户数,第二个表获取每个用户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