mysql - 如果列中不存在值设置为 0

标签 mysql

我正在尝试获取每场比赛的玩家人数,如果有一场比赛没有玩家,则将其设置为 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/

相关文章:

MySQL关于表单插入的问题

c# - 不确定如何根据解决方案配置设置 C# 连接字符串

mysql - 如何将流氓查询转换为Mysql?

mysql - 是否可以通过语句反转组?

mysql - 关系数据库和组合键

php - 查询结果显示问题

javascript - 防止 MySQL 行一次更新两次? (nodejs mysql)

php - select 语句中有 4 个 'ands'

MySQL Sum 只有特定类别 0 否则

mysql - 查询我似乎无法弄清楚的视频租赁数据库?