MySQL分组提取数据:将tournament表转换为指定格式的查询需求
解决MySQL tournament表的SQL转换需求
原表结构与数据
现有tournament表包含id、name、team字段,数据如下:
| id | name | team |
|---|---|---|
| 1 | Warren | A |
| 2 | Carol | B |
| 3 | Donna | |
| 4 | William | A |
| 5 | Andrew | C |
| 6 | Neil | A |
| 7 | Max | A |
| 8 | Phil | |
| 9 | William | |
| 10 | Keith | |
| 11 | Phil |
目标输出格式
需要将上述数据转换为以下格式:
| name | team |
|---|---|
| A | 1 |
| B | 1 |
| C | 1 |
| Donna | 0 |
| Keith | 0 |
| Phil | 0 |
| Phil | 0 |
| William | 0 |
当前尝试的SQL及问题
你当前写的SQL是:
select COALESCE(NULLIF(`team`,''), `name`) as name, case when `team` = '' THEN false when `team` != '' THEN true end as `group` from `tournament` order by COALESCE(NULLIF(`team`, ''), `name`) ASC;
存在几个问题:
- 输出列名错误:目标列是
team,但你用了group作为列名 - 布尔值未转成数字:目标要求用1/0,而你输出的是true/false
- 团队记录重复:每个团队成员都会输出一条团队名,导致A出现多次,不符合目标中每个团队只出现一次的要求
正确的SQL语句
以下是满足需求的SQL:
-- 提取非空团队的唯一记录,标记为1 SELECT DISTINCT `team` AS `name`, 1 AS `team` FROM `tournament` WHERE `team` != '' UNION ALL -- 提取team为空的记录,标记为0 SELECT `name`, 0 AS `team` FROM `tournament` WHERE `team` = '' -- 排序:让团队(A/B/C)排在前面,再按名称升序 ORDER BY CASE WHEN `name` IN ('A', 'B', 'C') THEN 0 ELSE 1 END, `name` ASC;
说明
- 第一部分用
DISTINCT去重,确保每个非空团队只输出一次,对应team列的1 - 第二部分筛选
team为空的记录,直接取name,对应team列的0 - 排序逻辑先把团队名称(A/B/C)排在最前面,再按
name升序排列,和目标输出顺序一致
内容的提问来源于stack exchange,提问作者neeraj
相关产品推荐
相关产品推荐

