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.利用内连接,比较待排序列,统计比较结果

...

原文地址:https://www.cnblogs.com/foolash/p/14326258.html