一、结论
1、group by带有两个或多个参数时,参数值 全部都相同的 数据会归为一类。
2、可以使用 count() 函数统计每一类的数据量,括号中可以使用任意一个参数。
3、可以使用 having 子句筛选出其中重复量大于1的数据。
二、示例
示例数据
第 1、2 条数据中的(start,end)是相同的,第 5、6、7 条数据(start,end)是相同的。其它两种数据各有1条,所以共有4种数据。
1、接下来使用 group by 对 start, end 进行聚类:
SELECT start,end FROM test1 GROUP BY start,end
得到的结果如下,共分为4类。可见,group by带有两个参数时,两个参数都相同的数据会归为一类。
2、还可以使用 count() 函数统计每一类有多少条数据:
注意 count(start) 与 count(end) 的效果是一样的,使用哪个都可以,都是此类的数量。
SELECT count(start) as sum, start, end FROM test1 GROUP BY start, end
或
SELECT count(end) as sum, start, end FROM test1 GROUP BY start, end
3、还可以使用 having 子句筛选数据量 >1 的数据:
可以用来寻找重复数据。
SELECT count(start) as sum, start, end FROM test1 GROUP BY start, end HAVING sum > 1
关于group_concat( DISTINCT info.sku_id ) sku_ids的使用。
函数语法:
group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
下面举例说明:
select id,price from goods;
以id分组,把price字段的值在同一行打印出来,逗号分隔(默认)
select id, group_concat(price) from goods group by id;
以id分组,把price字段的值在一行打印出来,分号分隔
select id,group_concat(price separator ';') from goods group by id;
(可以想象分组是聚合信息的报告统计表表,分组查询显示的字段只能是统计字段属性的表展示表唯一,加其他没在组内聚合统计的的字段会报错,所以显示的字段一般在分组上有,或在分组内统计的聚合结果可以加上group_concat或者求组内的字段平均值,或求和)。
以id分组,把去除重复冗余的price字段的值打印在一行,逗号分隔(默认以,分割)
select id,group_concat(distinct price) from goods group by id;
以id分组,把price字段的值去重打印在一行,逗号分隔,按照price倒序排列
select id,group_concat(DISTINCT price order by price desc) from goods group by id;
分析案例:在商城系统中商品详情页中购买商品会有sku的具体选择信息,分两部分,两张表以外键关联,现在选择到的属性要判断在哪些sku的产品中有,并获取这些id作为聚合字段(这一块内容可以去看商品详情页)
<select id="getSaleAttrBySpuId" resultMap="skuItemSaleAttrVo">
SELECT
ssav.attr_id attr_id,
ssav.attr_name attr_name,
ssav.attr_value,
group_concat( DISTINCT info.sku_id ) sku_ids
FROM
pms_sku_info info
LEFT JOIN pms_sku_sale_attr_value ssav ON ssav.sku_id = info.sku_id
WHERE
info.spu_id = #{spuId}
GROUP BY
ssav.attr_id,
ssav.attr_name,
ssav.attr_value
</select>