簡體   English   中英

MySQL-計算每組中的行數

[英]MySQL - Count number of rows in each group

我有一個SQL表user_game ,其中包含用戶擁有的游戲:

| id | user_id | game_id |
|----|---------|---------|
| 83 | 1       | 1       |
| 84 | 1       | 2       |
| 85 | 1       | 3       |
| 86 | 2       | 2       |
| 87 | 2       | 3       |
| 88 | 2       | 4       |
| 89 | 3       | 2       |

我正在嘗試計算擁有1個游戲,2個游戲,3個游戲等的用戶數量。

用戶1有3個游戲,用戶2有3個游戲,用戶3有1個游戲。 因此, 這些是我想要實現的結果

| no_of_games | COUNT(no_of_games) |
|-------------|--------------------|
| 1           | 1                  |
| 2           | 0                  |
| 3           | 2                  |

COUNT(no_of_games)是擁有該游戲數量的用戶數量。


我可以使用此查詢單獨獲取每個no_of_games的用戶數量:

-- Select no. of users with 1 game
SELECT no_of_games, COUNT(no_of_games)
FROM
(
  -- Select no. of games each user has
  SELECT user_id, COUNT(1) as no_of_games
  FROM user_game
  GROUP BY user_id
) as A
WHERE no_of_games = 1;

結果如下:

| no_of_games | COUNT(no_of_games) |
|-------------|--------------------|
| 1           | 1                  |

但是,我必須手動將no_of_games = 1更改為no_of_games = 1 ...,並使用此解決方案將它們UNION起來,在大約60種情況下我做不到。

有沒有更簡單的方法來實現這一目標?

您的問題有點棘手,因為沒有以特定頻率(例如2)出現在數據中的游戲組就不會僅使用原始表就出現在結果集中。 在下面的查詢中,我使用第二個表nums ,該表僅包含表示游戲數的序列1到10。 通過使用LEFT JOIN我們可以將每個游戲計數保留在最終結果集中。

SELECT t1.no_of_games,
       COALESCE(t2.no_of_games_count, 0) AS no_of_games_count
FROM nums t1
LEFT JOIN
(
    SELECT t.no_of_games, COUNT(*) AS no_of_games_count
    FROM
    (
        SELECT COUNT(*) AS no_of_games
        FROM user_game
        GROUP BY user_id
    ) t
    GROUP BY t.no_of_games
) t2
    ON t1.no_of_games = t2.no_of_games
ORDER BY t1.no_of_games

這是我用於nums的定義:

CREATE TABLE nums (`no_of_games` int);
INSERT INTO nums (`no_of_games`)
VALUES
    (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

演示在這里:

SQLFiddle

您可以找到每個用戶的游戲數量,然后找到每個游戲數量的用戶數量。

select cnt no_of_games, count(*) cnt_no_of_games
from(
    select user_id, count(*) cnt
    from your_table
    group by user_id
) t group by cnt;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM