【问题标题】:MySQL - Get the max count from a subquery groupMySQL - 从子查询组中获取最大计数
【发布时间】:2018-01-13 09:28:47
【问题描述】:

我有一个表logins,其架构如下:

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

...

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

对于表中的每个user_id,我想知道哪个weekday 的计数最高。

我尝试了以下查询:

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;

这让我得到weekday = 1 而不是2。我认为我不应该在这里使用WHERE 子句,但我无法获得正确的结果。

我检查了其他类似的问题,但没有运气,例如:

我用我的例子创建了一个 SQL Fiddle:http://sqlfiddle.com/#!9/e43a71/1

【问题讨论】:

    标签: mysql sql greatest-n-per-group


    【解决方案1】:

    这是一个方法:

    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(*) 可能并不总是在 InnoDB 中完美运行,因为 MySQL 5.7.19 中刚刚修复了一个错误。我之前遇到过这个问题。升级到 5.7.19 后似乎工作正常。 dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-19.html
    • @Marc。 . .你真的更喜欢这个答案的另一个答案吗?
    【解决方案2】:
    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);
    

    【讨论】:

    • 如果您有 Mariadb 10.2 或 MySQL 8.0.2+,您可以使用窗口函数或 WITH 语句编写更好、更短的查询。
    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2015-08-04
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多