You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL分组提取数据:将tournament表转换为指定格式的查询需求

解决MySQL tournament表的SQL转换需求

原表结构与数据

现有tournament表包含id、name、team字段,数据如下:

idnameteam
1WarrenA
2CarolB
3Donna
4WilliamA
5AndrewC
6NeilA
7MaxA
8Phil
9William
10Keith
11Phil

目标输出格式

需要将上述数据转换为以下格式:

nameteam
A1
B1
C1
Donna0
Keith0
Phil0
Phil0
William0

当前尝试的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;

存在几个问题:

  1. 输出列名错误:目标列是team,但你用了group作为列名
  2. 布尔值未转成数字:目标要求用1/0,而你输出的是true/false
  3. 团队记录重复:每个团队成员都会输出一条团队名,导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:25:11