1. 需求:分组查询,每个分组中第一条记录
1.1 方案1
使用 ANY_VALUE
函数,返回该分组中的第一个
tips: Mysql5.7及之后的版本, 因为默认sql_mode=“ONLY_FULL_GROUP_BY”不能直接返回group by 中不包含的字段
select ANY_VALUE(name), class_id from ( select distinct * from students where school_id = 1 order by age desc ) as filter_students group by filter_students.class_id order by filter_students.age
1.2 方案2
使用GROUP_CONCAT
拼接所有数据,再用SUBSTRING_INDEX
裁剪指定的段数
SELECT
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY `date` DESC),',',1)
FROM
`test`
GROUP BY
category_id
1.3 方案3
使用Mysql中用户自定义变量,实现类似开窗函数的作用;其中用到自定义变量
参考链接
参考链接
select * from (
select
case
when @dept_no_t != x.dept_no then @row_num_t := 1
else @row_num_t := @row_num_t + 1
end as sort_result,
x.id,
x.emp_name,
-- x.dept_no,
@dept_no_t := x.dept_no as dept_no,
x.emp_salary,
x.emp_hire_date
from
emp as x,
(select @dept_no_t := '') as t1,
(select @row_num_t := 0) as t2
order by
dept_no,
emp_salary desc
) as y
where y.sort_result = 1;
1.4 方案4
2. 踩坑之路
- group by中的子查询,子查询中的order by 会失效。因为mysql优化器的作用。可以再子查询中使用,limit 或 distinc 关键字来避免对应排序的失效
- mysql中自定义变量有很多坑。例如,会因为优化器的原因不执行,因sql语句每部分执行,会有先后顺序而影响【‘from’ ‘join on’ ‘where’ ‘group by’ ‘having’ ‘distinct’ ‘order by’ ‘limit’ ‘select’】