mysql分组语法group by获取数据技巧----group_concat

 

项目中有一个需求是,通过分组字段A,然后拿到A中最小的字段B的值。

试了子查询和一些其他方法,都不能很好地解决问题。

然后去看了mysql文档找到了这个函数。可以解决问题,虽然不是很简单。

先介绍一下这个语法:

group_concat:以A分组,将B所有的值以逗号隔开查询出来;

select content,GROUP_CONCAT(id ORDER BY id desc SEPARATOR '_') from cmdb_alarm group by content--默认的间隔符是逗号
xxx报警2	100_99_98_97_96_95_94_93
xxx报警3	301_300_299_298_297_296_295_294_293_292_291_290_289_288_287_286_285_284_283_282_281_280_279_278_277_276_275_274_273_272_271_270_269_268_267_266_265_264_263_262_261_260_259_258_257_256_255_254_253_252_251_250_249_248_247_246_245_244_243_242_241_240_239_238_237_236_235_234_233_108_107_106_105_104_103_102_101
xxx报警4	117_116_115_114_113_112_111_110
xxx报警5	127_126_125_124_123_122_121_120
xxx报警6	137_136_135_134_133_132_131_130
xxx报警7	148_147_146_145_144_143_142_141_140

通过上面可以看出,结果都查询出来了,剩下的就是从concat的结果中拿到数据。

这里可以通过另一个函数substring_index(str,delim,count);

select content,SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY id desc SEPARATOR '_'),'_',1) from cmdb_alarm group by content
xxx报警2	100
xxx报警3	301
xxx报警4	117
xxx报警5	127
xxx报警6	137

可以看到,结果符合我们的要求。

 

学习使我们进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值