MySQL两表二次关联后实现Pivot行转列取分组最小值
MySQL 表合并+透视实现方案
你卡壳的透视步骤在MySQL里不需要依赖原生PIVOT函数(MySQL本身也没提供这个语法),用条件聚合就能直接实现,而且你之前写的SQL存在分组维度错误的问题,会导致结果拆分过多无法聚合到Candy维度。
问题点说明
你之前的子查询把Shadow、Form字段加入了GROUP BY维度,会导致同一个Candy+League组合拆分出多条不同形态、不同暗影状态的记录,既没法取到同Candy下所有形态的全局最小Tier,也没法直接透视成单行结果。从你给出的期望输出看,同Candy对应的整条进化链,是共享所有形态(普通/暗影/Mega)下各League的最小Tier值的,不需要按Form、Shadow拆分分组。
可直接运行的SQL代码
SELECT d.ID, d.DexNum, d.Pokemon, d.Candy, COALESCE(t.Attackers, 0) AS Attackers, COALESCE(t.Master, 0) AS Master, COALESCE(t.Ultra, 0) AS Ultra, COALESCE(t.Great, 0) AS Great FROM pogo_dex d LEFT JOIN ( SELECT dx.Candy, MIN(CASE WHEN m.League = 'Attackers' THEN m.Tier END) AS Attackers, MIN(CASE WHEN m.League = 'Master' THEN m.Tier END) AS Master, MIN(CASE WHEN m.League = 'Ultra' THEN m.Tier END) AS Ultra, MIN(CASE WHEN m.League = 'Great' THEN m.Tier END) AS Great FROM pogo_meta m INNER JOIN pogo_dex dx ON m.DexNum = dx.DexNum GROUP BY dx.Candy ) t ON d.Candy = t.Candy ORDER BY d.ID ASC;
实现逻辑
- 内层子查询一次性完成关联+聚合+透视三个动作:先关联
pogo_meta和pogo_dex拿到每条强度记录对应的Candy分组,再通过CASE WHEN匹配League字段,配合MIN函数直接计算每个Candy分组下对应League的最小Tier值,直接输出每个Candy一行的透视后结果 - 外层查询把透视后的Candy维度结果左连接回
pogo_dex主表,给每个宝可梦个体带上对应进化链的Tier值 - 用
COALESCE函数把没有对应League记录的空值替换为0,完全匹配你给出的期望输出格式 - 运行结果和你给出的样例期望值完全一致:妙蛙种子链Attackers取Mega形态的最小Tier1、喷火龙链取Mega Y的0.9、水箭龟链取Mega形态的1、绿毛虫链只有Great联赛的5其余补0。
内容的提问来源于stack exchange,提问作者Ray Hollister
相关产品推荐
相关产品推荐

