【问题标题】:MySQL - group by on groupped resultMySQL - 按分组结果分组
【发布时间】:2018-10-30 20:30:42
【问题描述】:

不确定如何最好地为问题命名。

我有一张记录玩家获胜的表格。我需要查询有多少玩家赢了多少。

这是一个示例数据库:https://www.db-fiddle.com/f/gCEKmtPQr7nvhiZDyexn9C/0 这是预期的结果:

wins, players_count
1, 1
2, 3

我有点迷路了。我可以轻松获得每位玩家的获胜次数(按 user_id 分组,其中 status='win' 并选择计数),但是如何将这些结果分组到我的预期结果中?

谢谢!

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:
    • 您需要使用带有Group By 的两级选择查询。子选择查询也称为Derived Table
    • 在内部选择查询中,获取每位用户的总获胜次数。
    • 现在,在外部选择中,Group By 获得总胜数,并为他们计算用户数。

    尝试以下方法:

    SELECT 
      dt.total_wins AS wins, 
      COUNT(*) AS players_count 
    FROM 
    (
      SELECT
        user_id, 
        COUNT(*) AS total_wins 
      FROM a 
      WHERE status = 'win' 
      GROUP BY user_id
    ) AS dt 
    GROUP BY dt.total_wins 
    

    架构 (MySQL v5.7)

    CREATE TABLE a (status VARCHAR(255), user_id int);
    
    INSERT INTO a (status, user_id)
    VALUES ('win', 1),
    ('win', 2),
    ('win', 3),
    ('win', 2),
    ('win', 4),
    ('win', 4),
    ('win', 1),
    ('not win', 1);
    

    查询结果

    | wins | players_count |
    | ---- | ------------- |
    | 1    | 1             |
    | 2    | 3             |
    

    View on DB Fiddle

    【讨论】:

    • 我相信就是这样,让我适应我的实际项目,我会把它标记为正确的。非常感谢!
    • @devk 乐于助人:)
    【解决方案2】:

    这是一个没有CASE 语句的示例:

    获得wins_per_user 后,只需计算user_ids,然后再次按wincount 分组:

    SELECT
      wincount AS WinCount, count(user_id) as UserCount
    FROM
      (SELECT 
       count(*) as wincount, user_id
      FROM a 
        where status='win'
      GROUP BY user_id) as wins_per_user
    GROUP BY wincount
    

    结果

    WinCount UserCount
    1        1
    2        3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      相关资源
      最近更新 更多