项目中有一个需求是,通过分组字段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
可以看到,结果符合我们的要求。
学习使我们进步