今天在开发时,遇到一个小需求,大概需求是:
-
描述:有一张mysql单表,表中有10W+的数据,主键ID为自增。
-
备注:可能存在几条数据部分字段相同。
-
需求:根据一定条件查询数据,如果查询结果中有重复的数据存在。则过滤重复字段的数据,取ID最大的一条数据。
不知道我说的明白不,举个栗子吧,哈哈哈,这样一目了然。
有一张学生成绩表tb_student_achievement,多个学生可能存在age和grade都相同的情况
| id | sex | name | age | grade |
|---|---|---|---|---|
| 1 | 男 | 张三 | 15 | 90 |
| 2 | 男 | 李四 | 16 | 95 |
| 3 | 男 | 王五 | 15 | 90 |
| 4 | 男 | 赵六 | 16 | 95 |
| 5 | 男 | 冯七 | 14 | 100 |
| 6 | 女 | 郭八 | 15 | 98 |
| 7 | ... | ... | ... | ... |
- 需求:找出班级中男生的成绩,并按照成绩从高到低排序,如果年龄和成绩都相同,则取ID最大的一条即可。
- 需要的结果如下: | id | sex | name | age |grade | |------|------------|------------|--------|--------| | 5 | 男 | 冯七 |14 |100 | | 4 | 男 | 赵六 |16 |95 | | 3 | 男 | 王五 |15 |90 |
- 思路:
- 首先我们的查询条件为sex=男;
- 我们需要按照年龄和成绩分组,需要过滤年龄和成绩都相同的重复数据;
- 过滤结果需要取出ID最大的那条数据;
- 返回数据所有列的信息; 下面为查询SQL:
SELECT a.*
FROM tb_student_achievement a,
(
SELECT MAX(id) as id
FROM tb_student_achievement
WHERE sex= '男'
GROUP BY `age`, `grade`) b
WHERE a.id= b.id
ORDER BY a.grade DESC;
当然,如果有重复数据要取ID最小的只需要修改max函数为min即可,其他情况依据思路修改就好啦。
- 欢迎留下更加简单的sql语句呦,共同学习。