MySQL-从子查询组获取最大计数

MySQL-从子查询组获取最大计数,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我有一个表logins,其模式如下: | id | user_id | weekday | |----|---------|---------| | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 1 | 2 | ... 工作日是一个从0到6的数字 对于表中的每个用户id,我想得到哪个工作日的计数最高 我尝试了以下查询: SELECT MAX(num) as max_num, user_id, we

我有一个表
logins
,其模式如下:

| id | user_id | weekday |
|----|---------|---------|
|  1 |       1 |       1 |
|  2 |       1 |       2 |
|  3 |       1 |       2 |

...
工作日是一个从0到6的数字

对于表中的每个
用户id
,我想得到哪个
工作日的计数最高

我尝试了以下查询:

SELECT MAX(num) as max_num, user_id, weekday
FROM (
    SELECT COUNT(*) as num, user_id, weekday
    FROM logins
    GROUP BY user_id, weekday
) C
WHERE user_id = C.user_id AND num = C.num
GROUP BY user_id;
这使我在工作日
1
而不是
2
。我认为我不应该在这里使用
WHERE
子句,但我无法获得正确的结果

我查过其他类似的问题,但运气不佳,例如:

我用我的示例创建了一个SQL FIDLE:

以下是一个方法:

SELECT user_id, MAX(num) as max_num, 
       SUBSTRING_INDEX(GROUP_CONCAT(weekday ORDER BY num DESC), ',', 1) as weekday_max
FROM (SELECT user_id, weekday, COUNT(*) as num
      FROM logins l
      GROUP BY user_id, weekday
     ) uw
GROUP BY user_id;

请注意,
count(*)
由于MySQL 5.7.19中刚刚修复的一个bug,在InnoDB中可能并不总能完美工作。我之前有这个问题。升级到5.7.19后似乎工作正常@马克。你真的更喜欢另一个答案吗?如果你有Mariadb 10.2或MySQL 8.0.2+,你可以使用window函数或Station编写更好、更短的查询。
SELECT days.user_id, days.weekday, days.num
FROM (
    SELECT user_id, MAX(num) AS num
    FROM (
      SELECT user_id, weekday, COUNT(*) AS num
      FROM logins
      GROUP BY user_id, weekday
    ) max
    GROUP BY user_id
) nums
JOIN (
    SELECT user_id, weekday, COUNT(*) as num
    FROM logins
    GROUP BY user_id, weekday
) days ON(days.user_id = nums.user_id AND days.num = nums.num);

-- With Mariadb 10.2 or MySQL 8.0.2
WITH days AS (
    SELECT user_id, weekday, COUNT(*) as num
    FROM logins
    GROUP BY user_id, weekday
)
SELECT days.user_id, days.weekday, days.num
FROM (
    SELECT user_id, MAX(num) AS num
    FROM days
    GROUP BY user_id
) nums
JOIN days ON(days.user_id = nums.user_id AND days.num = nums.num);