使用 GROUP_CONCAT 进行一对多查询,拼接结果(实例解析)

在数据库查询中,遇到GROUP_CONCAT函数生成的字段包含空字符串时,会导致结果中出现多余的分隔符。解决方法是在子查询中加入IF条件判断,将空字符串替换为NULL,从而避免分隔符的异常显示。通过这种方式,可以确保查询结果的正确性和整洁性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:一个订单,包含多个商品

要求:查订单的时候,将这个订单包含的所有商品都查出来,放到goodsNames字段中,用逗号分割

结果例如:goodsNames: “苹果, 香蕉, 螃蟹”

子查询语句

( SELECT GROUP_CONCAT( DISTINCT goods_name ORDER BY create_time SEPARATOR ',' ) FROM t_goods_detail WHERE order_id = order.id ) as goodsNames,

解析:

  • GROUP_CONCAT 就是连接多个结果的函数,里面goods_name就是要拼接的字段
  • 使用 DISTINCT 还可以对其去重
  • ORDER BY create_time 就是这些字段拼接的顺序,谁在前,谁在后,按照创建时间来排序
  • SEPARATOR 就是分隔符的意思,后面引号中是多个字段的连接符,例如用逗号分割
  • 最后将这个子查询拼接好后的结果,AS给 goodsNames

结果:goodsNames: “苹果, 香蕉, 螃蟹”

订单实体:order

private Long id;
private String orderName;
......
private String goodsNames;

全部SQL

SELECT id AS id, 
       order_name AS orderName,
       ......
       ( SELECT GROUP_CONCAT( DISTINCT goods_name ORDER BY create_time SEPARATOR ',' ) FROM t_goods_detail WHERE order_id = order.id ) as goodsNames
FORM order
WHERE id = #{id}

问题:

当查询的商品名称结果中,某个商品名称为空字符串,那么就会出现如下结果

goodsNames: “苹果, , 螃蟹”

也就是,名称不在了,但分隔符还在

解决办法:在查询的时候,加一层判断,如果为空字符串,则赋值为NULL(NULL就不会出现这种情况了)

( SELECT GROUP_CONCAT( DISTINCT IF ( goods_name = '', NULL, goods_name ) ORDER BY create_time SEPARATOR ',' ) FROM t_goods_detail
WHERE order_id = order.id ) AS goodsNames
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值