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

标签 mysql

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

它有一个用户 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 functionSubquery结合使用来获得相同的结果。

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

Check the Fiddle here

关于MySQL仅对特定数量的记录进行分组(在JOIN表达式中查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58620982/

相关文章:

java - DeviceDriver 连接语句未执行

php - 如何使用 php 更新数据库?

php - 数据库结构

php - 用户名和密码验证PHP MySql

MySQL 无法访问子查询中的别名

php - 如何从 phpMyAdmin 获取数据,取决于用户选择的难度级别

php - 使用 PDO 循环调用存储过程给出先前的调用结果

php - 使用 php 从具有多个参数(来自不同列)的 mysql 表中查找行

c# - 在从 MS SQL Server 转换为 MySQL 时无法保存 Unicode

php - 将 PHP 表单插入到 MySQL 数据库会产生重复的意外结果