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
相关产品推荐
相关产品推荐

