【无标题】

一、结论
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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值