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

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

要求:查订单的时候,将这个订单包含的所有商品都查出来,放到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

版权声明:本文为weixin_42193813原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。