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,然后进行排序,固定字符进行拼接,后台对*号进行分割处理