mysql group by之后如何选取自己需要的记录

max()等函数不能解决之外:

在这里插入图片描述
mysql group by
默认排序最前面那一条数据。mysql查询语句是先执行group by再执行order by的。

但是目前想取时间最新的一条记录:

方法1:循环嵌套一层,先order by 之后再分组
SELECT * FROM (SELECT * from tb_dept ORDER BY id desc LIMIT 10000) a GROUP BY parent_id;

不加LIMIT 可能会无效,由于mysql的版本问题。但是总觉得这种写法不太正经,因为如果数据量大于 Limit 的值后,结果就不准确了。所以就有了第二种写法。

这个方法的成立需要一个前提,就是MySQL 在 Group By 后是按照当前数据排列顺序选择第一条记录的。

ONLY_FULL_GROUP_BY 这个配置决定了能否在 SELECT 后的字段中出现 Group By 后没有的字段。ONLY_FULL_GROUP_BY 为 disabled时,允许SELECT 后的字段中出现 Group By 后没有的字段;ONLY_FULL_GROUP_BY 为 enable 时, 只能 SELECT 在 Group By 后出现的字段。而在大多数情况下,为了减轻程序员编写sql语句的压力,ONLY_FULL_GROUP_BY 都会建议设为 disabled。(加了limit能解决)

方法2:用GROUP_CONCAT解决,然后程序进行分割最新的

		select mb.ID as messageId,mb.CREATER as createId,
        GROUP_CONCAT(IFNULL(mr.content,mb.CONTENT) ORDER BY  IFNULL(mr.create_date,mb.CREATE_DATE)   desc separator '*' )as messageShowContent,
        GROUP_CONCAT(IFNULL(mr.create_date,mb.CREATE_DATE) ORDER BY  IFNULL(mr.create_date,mb.CREATE_DATE)   desc separator '*')as messageShowTimeStr
        from message_board mb  LEFT JOIN message_reply  mr  on  mb.ID=mr.msg_brd_id and  mr.enterprise_id  <> '440118002175'
        where
       
         mb.ID in ('9b2f2e72f88c40d5961f2ff36a34011d')
    
         GROUP BY  mb.ID  ORDER BY IFNULL(mr.create_date,mb.CREATE_DATE) desc

在这里插入图片描述
可以选择需要的那条记录所需要的字段用GROUP_CONCAT,然后进行排序,固定字符进行拼接,后台对*号进行分割处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值