mysql 组内排序(分组之前排序,如分组取最新时间的数据)
Oracle、SQL server数据库的分组排序函数rank()over()、row_number()over()、dense_rank()over()
MySQL没有这三个函数。
sql执行顺序图
1.利用group_concat()函数内置的order by分组排序属性
group_concat()函数完整语法
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
-- GROUP_CONCAT 默认长度限制是1024 默认分隔符',' -- group_column 分组字段 -- required_out_group_column 需要排序的非分组字段。如按大楼楼层分组,每个楼层最晚到班的人的姓名或者到班时间 -- 分组排序查询某个字段 SELECT group_column, SUBSTRING_INDEX(GROUP_CONCAT(required_out_group_column ORDER BY order_time DESC SEPARATOR ','), ',', 1) AS require_column1 FROM table_name GROUP BY group_column -- 分组排序查询所有字段 SELECT t1.*, t2.stu_name FROM test t1 RIGHT JOIN (SELECT stu_name, GROUP_CONCAT(id ORDER BY RECORD_TIME DESC) order_id FROM test GROUP BY stu_name) t2 ON t1.stu_name = t2.stu_name AND FIND_IN_SET(t1.id, t2.order_id) = 1 -- <=> -- t1.id = SUBSTRING_INDEX(t2.order_id,',',1)
2.
SELECT * FROM (SELECT t1.*, t2.product_id pid FROM tb_group_order t1 LEFT JOIN tb_group_order t2 ON t1.id = t2.id -- ** HAVING 1 ORDER BY t2.record_time DESC) t GROUP BY t.pid
Mysql 取分组后时间最大的一整条数据 及一些分组后取出每天最大时间一条
3. 利用变量赋值
...
https://blog.51cto.com/mrcelite/745913
4.利用内连接,比较待排序列,统计比较结果
...