SQL双表关联下使用GROUP BY与SUM按币种拼接PACKAGE总金额实现问题
问题原因
你遇到的报错确实是子查询嵌套层级导致的:MySQL的相关子查询仅支持外层查询的字段向下穿透1层,你的写法中嵌套了两层子查询,最内层的WHERE条件自然无法识别到最外层的packages.id字段。
正确实现方案
推荐先对PRODUCT表按package_id、currency分组汇总各币种总额,再关联PACKAGE表做字符串拼接,写法兼容MySQL 5.7及以上版本,执行效率也更高:
SELECT p.id, GROUP_CONCAT( CONCAT(pt.currency, ' ', pt.total_sum) ORDER BY pt.currency SEPARATOR ', ' ) AS total_amount FROM PACKAGE p LEFT JOIN ( SELECT package_id, currency, SUM(total) AS total_sum FROM PRODUCT GROUP BY package_id, currency ) pt ON p.id = pt.package_id GROUP BY p.id
说明
- 如果不需要保留无关联产品的PACKAGE记录,把
LEFT JOIN替换为INNER JOIN即可 GROUP_CONCAT中指定ORDER BY可以保证币种的输出顺序稳定,SEPARATOR用来指定拼接的分隔符,和你预期的输出格式完全匹配
内容的提问来源于stack exchange,提问作者Đorđe Sević
相关产品推荐
相关产品推荐

