如何将GROUP_CONCAT聚合结果拆分为独立行而非CSV拼接组?
解决方案:拆分GROUP_CONCAT结果为单独行
你现在的查询用GROUP_CONCAT把符合条件的产品名合并成了一行,但想要拆分成每个产品单独一行并显示对应的ID,其实可以调整查询逻辑,不需要再使用分组和合并函数,直接筛选出符合条件的产品即可。
方法一:使用子查询筛选目标orig_id
先找出所有包含id=6的orig_id,再关联产品表获取对应的产品信息:
SELECT p.id, p.name AS names FROM cte t JOIN products p ON p.tag_id = t.id WHERE t.orig_id IN ( SELECT orig_id FROM cte WHERE id = 6 ) ORDER BY p.id;
方法二:使用EXISTS子查询
通过EXISTS判断当前产品所属的orig_id是否存在id=6的记录,逻辑更直观:
SELECT p.id, p.name AS names FROM products p JOIN cte t ON p.tag_id = t.id WHERE EXISTS ( SELECT 1 FROM cte t2 WHERE t2.orig_id = t.orig_id AND t2.id = 6 ) ORDER BY p.id;
执行结果
这两个查询都会返回你期望的结果:
+----+-------------------------------------+ | id | names | +----+-------------------------------------+ | 2 | iPhone 14 Promax | | 3 | Samsung Galaxy A55 | +----+-------------------------------------+
逻辑说明
原查询的HAVING SUM(t.id = 6) > 0是为了筛选出那些分组(按orig_id)中包含id=6的记录,上面两种方法都是先定位到这些符合条件的orig_id,再关联产品表取出每个产品的单独数据,自然就不需要合并成一行了。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

