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

MySQL查询需求:关联promotions表主记录及对应子记录

解决方案:同表自关联查询主记录与子记录

没问题,针对你这个同表自关联的查询需求,我给你两种常用的写法,根据你的实际场景选择就行:

1. 聚合子记录ID为单个字段(推荐用于统计场景)

这种写法会把每个主记录的所有子记录PromotionID合并成逗号分隔的字符串,每条主记录只显示一行:

SELECT 
    p1.PromotionMaintenanceID,
    p1.PromotionID,
    p1.PromotionName,
    -- 把子记录的PromotionID用逗号分隔拼接,SEPARATOR可自定义分隔符
    GROUP_CONCAT(p2.PromotionID SEPARATOR ', ') AS ChildPromotionIDs
FROM 
    promotions p1
-- 左连接确保即使主记录没有子记录也会被查询出来
LEFT JOIN 
    promotions p2 ON p1.PromotionID = p2.PID
-- 如果只想查询有子记录的主记录,把上面的LEFT JOIN改成INNER JOIN即可
GROUP BY 
    p1.PromotionMaintenanceID, p1.PromotionID, p1.PromotionName;

关键说明:

  • 用p1作为主记录的别名,p2作为子记录的别名,通过p1.PromotionID = p2.PID建立关联
  • GROUP_CONCAT是MySQL专属的聚合函数,专门用来拼接同组的字符串
  • 如果需要过滤掉没有子记录的主记录,直接替换LEFT JOIN为INNER JOIN即可

2. 逐条显示主记录与子记录的对应关系

如果需要看到每条主记录和它的子记录的一一对应(主记录会随子记录数量重复显示),用这个写法:

SELECT 
    p1.PromotionMaintenanceID,
    p1.PromotionID,
    p1.PromotionName,
    p2.PromotionID AS ChildPromotionID
FROM 
    promotions p1
LEFT JOIN 
    promotions p2 ON p1.PromotionID = p2.PID;

关键说明:

  • 没有使用聚合函数,所以每一条子记录都会生成一行结果
  • 如果主记录没有子记录,ChildPromotionID字段会显示为NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:55:17