Mysql查询重复数据(字段)取其中一条

1,842 阅读2分钟

今天在开发时,遇到一个小需求,大概需求是:

  • 描述:有一张mysql单表,表中有10W+的数据,主键ID为自增。

  • 备注:可能存在几条数据部分字段相同。

  • 需求:根据一定条件查询数据,如果查询结果中有重复的数据存在。则过滤重复字段的数据,取ID最大的一条数据。

不知道我说的明白不,举个栗子吧,哈哈哈,这样一目了然。

有一张学生成绩表tb_student_achievement,多个学生可能存在age和grade都相同的情况

idsexnameagegrade
1张三1590
2李四1695
3王五1590
4赵六1695
5冯七14100
6郭八1598
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语句呦,共同学习。