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