分组函数group by使用技巧

一、需求:获取销售版本组合

分组函数group by使用技巧_第1张图片
颜色(属性名)+ (黑色,白色…) 属性值集合

    @Data
    public static class ItemSaleAttrsVo{
        private Long attrId;
        private String attrName;
        //当前属性有多少种版本:黑色,白色,蓝色,这里使用字符串拼接的方式所以没有使用集合存储
        private String attrValues;

    }

分组函数group by使用技巧_第2张图片

二、Group by分组

为什么经常使用group by分组会报错呢?想要分组成功就必须保证查询结果的字段值保证一对一的关系

(1)分组前,每个字段的记录都是一 一对应的
分组函数group by使用技巧_第3张图片
(2)select 字段A ,字段B from XX gorup by 字段A
如果只对字段A进行group by 分组,如果是按种类分组,那么每个种类就只会展示一条记录,此时与其他未分组的字段会形成一对多的关系
那么数据库是无法展示结果的,并且报错
分组函数group by使用技巧_第4张图片
(3)怎么解决一对多的问题,将未分组的字段也转换成一条记录,这样就能保证一对一
可以将查询的结果分成两类,select 分组的字段,未参与分组的字段 from xxx
分组的字段使用group by,未参与分组的字段就必须使用聚合函数(group_concat,count ,avg,sum…)聚合为一条记录
分组函数group by使用技巧_第5张图片

三、查询结果

使用group_concat聚合函数可以将多记录合并
分组函数group by使用技巧_第6张图片

SELECT 
	b.attr_id,
	b.attr_name,
	GROUP_CONCAT(DISTINCT b.`attr_value`)
FROM `pms_sku_info` a LEFT JOIN `pms_sku_sale_attr_value` b ON a.sku_id = b.sku_id
WHERE a.spu_id = 28
GROUP BY b.attr_id,b.attr_name

distinct 去重后
分组函数group by使用技巧_第7张图片

你可能感兴趣的:(mysql)