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

Leetcode中等题重排产品表:MySQL INFORMATION_SCHEMA写法原理解析

Leetcode中等难度题:Rearrange Products Table(重排产品表)

题目输入输出示例:
题目输入输出示例

讨论区参考解答代码

SELECT A.product_id, B.COLUMN_NAME as store,
CASE
    WHEN B.COLUMN_NAME = "store1" THEN store1
    WHEN B.COLUMN_NAME = "store2" THEN store2
    WHEN B.COLUMN_NAME = "store3" THEN store3
END AS price
FROM Products A, INFORMATION_SCHEMA.COLUMNS B
  WHERE table_name = 'Products' AND column_name != "product_id"
  HAVING price IS NOT NULL

语句运行逻辑&关联系统表能返回正确结果的原因

这段SQL没有用常规列转行写法里的多段UNION ALL,而是借助MySQL系统表的元数据,隐式完成笛卡尔积+动态列匹配,最终输出符合题目要求的结果,执行逻辑拆解如下:

  • 首先明确INFORMATION_SCHEMA.COLUMNS的作用:这是MySQL内置的系统元数据表,存储当前数据库下所有表的字段定义信息。语句中对该表加了过滤条件table_name = 'Products' AND column_name != "product_id",最终查出的结果正好是Products表除主键product_id之外的3个业务字段:store1、store2、store3,共3条记录,每条记录的COLUMN_NAME字段值就是对应的门店字段名。
  • FROM子句用逗号分隔两个表且未指定关联条件,属于隐式笛卡尔积连接:会把Products表的每一行产品数据,和上一步查到的3条字段元数据做两两全匹配。也就是说Products里每1条产品记录,会在这一步生成3行中间结果,分别对应关联到store1、store2、store3三个字段的元数据行。
  • CASE语句实现动态取值:根据当前中间结果行关联到的B.COLUMN_NAME(即门店字段名),取产品行对应门店列的价格值。比如当前行关联的元数据是store1,就取A.store1的值作为price;关联到store2就取A.store2的值,以此类推,同时直接把B.COLUMN_NAME作为结果集中的store字段值。
  • 最后用HAVING price IS NOT NULL过滤空值行:正好匹配题目“只保留产品在对应门店有售价的记录”的要求,最终输出的结构就是题目需要的长表格式:每一行对应「产品ID-门店-售价」的三元组。

这个写法的巧思在于不需要手动枚举所有store列,只要表结构中除了product_id之外的列都是门店价格字段,哪怕后续新增store4、store5字段,这段SQL不需要修改就能直接返回正确结果。

内容的提问来源于stack exchange,提问作者jokerBatman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:36:27