MySQL - 计算每组中的行数

标签 mysql sql sequelpro

我有一个 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 更改为 2、3、4... 并使用此解决方案将它们 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

关于MySQL - 计算每组中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41562569/

相关文章:

mysql - 在 MySQL/Sequel Pro 中将 VARCHAR 列转换为 INT

mysql - 随机化所有现有条目的日期时间列值

php - MySQL/PHP 度数符号

mysql - 使用sql中另一个表的计数函数从一个表中选择列

mysql - 从一个表中选择id,从另一个表中选择它的值进行搜索

sql - MS SQL Server - 如何从 CTE 创建 View ?

mysql - SQL 无法添加或更新子行 : a foreign key constraint

sql - 按性别列出员 worker 数

MySql 分配变量时出错

mysql - 如何在使用 Sequel Pro 导入期间将字符串更改为日期?