我正在尝试获取每场比赛的玩家人数,如果有一场比赛没有玩家,则将其设置为 0。
该表是从 C++ 填充的,因此作业播放器需要以与 C++ 枚举相同的顺序显示。
玩家表存储来自玩家的所有数据,并且职业列不为空,因为要创建玩家必须选择职业。如果没有玩家参加该比赛,我想将比赛计数显示为 0。
我已经尝试过使用 COALESCE 但没有成功。
还看到了有关使用 JOIN 的其他主题,但不适用于此处。我只有一张 table 来处理这个问题。
我当前的查询:
SELECT
player.job AS race,
Count(player.job) AS count_races
FROM
player
GROUP BY
race
ORDER BY
FIELD(race, 0, 4, 5, 1, 2, 6, 7, 3, 8, 9) ASC;
我得到了什么:
race count_races
0 5
5 3
1 2
2 6
6 2
3 4
我期望得到什么:
race count_races
0 5
4 0
5 3
1 2
2 6
6 2
7 0
3 4
8 0
9 0
我的表结构:
CREATE TABLE `player` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account_id` int(11) NOT NULL DEFAULT 0,
`name` varchar(24) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'NONAME',
`job` tinyint(2) UNSIGNED NOT NULL DEFAULT 0,
`dir` tinyint(2) NOT NULL DEFAULT 0,
`x` int(11) NOT NULL DEFAULT 0,
`y` int(11) NOT NULL DEFAULT 0,
`z` int(11) NOT NULL DEFAULT 0,
`map_index` int(11) NOT NULL DEFAULT 0,
`exit_x` int(11) NOT NULL DEFAULT 0,
`exit_y` int(11) NOT NULL DEFAULT 0,
`exit_map_index` int(11) NOT NULL DEFAULT 0,
`hp` int(4) NOT NULL DEFAULT 0,
`playtime` int(11) NOT NULL DEFAULT 0,
`level` tinyint(2) UNSIGNED NOT NULL DEFAULT 1,
PRIMARY KEY (`id`, `last_play`) USING BTREE,
UNIQUE INDEX `name_idx`(`name`) USING BTREE,
INDEX `account_id_idx`(`account_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 1114 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
最佳答案
Quote (comment) from Karbust:
I edited my question, I don't believe the other question can answer mine. Also added my player table structure and explained a little better.
是的,可以,但技巧是向 COUNT(*)
添加一个相关的子查询。
SELECT
search_filter.job
, (SELECT
COUNT(*)
FROM player player_inner
WHERE player_inner.job = player_outer.job
) AS count_races
FROM (
SELECT
0 AS job
UNION
SELECT
4 AS job
UNION
SELECT
5 AS job
UNION
SELECT
1 AS job
UNION
SELECT
2 AS job
UNION
SELECT
6 AS job
UNION
SELECT
7 AS job
UNION
SELECT
3 AS job
UNION
SELECT
8 AS job
UNION
SELECT
9 AS job
# [...]
) AS search_filter
LEFT JOIN
player player_outer
ON
search_filter.job = player_outer.job
ORDER BY
FIELD(search_filter.job, 0, 4, 5, 1, 2, 6, 7, 3, 8, 9) ASC;
结果(因为表格为空):
| job | count_races |
+-----+-------------+
| 0 | 0 |
| 4 | 0 |
| 5 | 0 |
| 1 | 0 |
| 2 | 0 |
| 6 | 0 |
| 7 | 0 |
| 3 | 0 |
| 8 | 0 |
| 9 | 0 |
参见demo
没有相关子查询的更优化版本是。
SELECT
search_filter.job
, COUNT(CASE WHEN player.job IS NOT NULL THEN 1 ELSE NULL END) AS count_races
FROM (
SELECT
0 AS job
UNION
SELECT
4 AS job
UNION
SELECT
5 AS job
UNION
SELECT
1 AS job
UNION
SELECT
2 AS job
UNION
SELECT
6 AS job
UNION
SELECT
7 AS job
UNION
SELECT
3 AS job
UNION
SELECT
8 AS job
UNION
SELECT
9 AS job
# [...]
) AS search_filter
LEFT JOIN
player
ON
search_filter.job = player.job
GROUP BY
search_filter.job
ORDER BY
FIELD(search_filter.job, 0, 4, 5, 1, 2, 6, 7, 3, 8, 9) ASC
参见demo
关于mysql - 如果列中不存在值设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57203446/