groupby on groupped结果

qvtsj1bj  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(292)

不知道如何最好的标题问题。
我有一张记录玩家胜负的table。我需要查询有多少玩家赢了多少场。
下面是一个db示例:https://www.db-fiddle.com/f/gcekmtpqr7nvhizdyexn9c/0 预期结果如下:

wins, players_count
1, 1
2, 3

我有点迷路了。我可以很容易地获得每个玩家的胜利数(按用户id分组,其中status='win'并选择count on it),但是如何将这些结果分组到我的预期结果中呢?
谢谢!

mlnl4t2r

mlnl4t2r1#

下面是一个没有 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
ahy6op9u

ahy6op9u2#

您需要将两级select查询用于 Group By . 子选择查询也称为派生表。
在内部select查询中,获取每个用户的总wins数。
现在,在外部选择中, 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             |

db fiddle视图

相关问题