今天帮别人修改程序,需要分组去最大值。也就是所谓,某一字段有重复字,过滤掉有重复的数据。弄了半天,最后总结一下。

首先搞点模拟数据出来

create table t2 (

id int primary key,

gid char,

col1 int,

col2 int

) engine=myisam;

insert into t2 values

(1,'A',31,6),

(2,'B',25,83),

(3,'C',76,21),

(4,'D',63,56),

(5,'E',3,17),

(6,'A',29,97),

(7,'B',88,63),

(8,'C',16,22),

(9,'D',25,43),

(10,'E',45,28),

(11,'A',2,78),

(12,'B',30,79),

(13,'C',96,73),

(14,'D',37,40),

(15,'E',14,86),

(16,'A',32,67),

(17,'B',84,38),

(18,'C',27,9),

(19,'D',31,21),

(20,'E',80,63),

(21,'A',89,9),

(22,'B',15,22),

(23,'C',46,84),

(24,'D',54,79),

(25,'E',85,64),

(26,'A',87,13),

(27,'B',40,45),

(28,'C',34,90),

(29,'D',63,8),

(30,'E',66,40),

(31,'A',83,49),

(32,'B',4,90),

(33,'C',81,7),

(34,'D',11,12),

(35,'E',85,10),

(36,'A',39,75),

(37,'B',22,39),

(38,'C',76,67),

(39,'D',20,11),

(40,'E',81,36);

期望结果

1) N=1 取GID每组 COL2最大的记录

+----+------+------+------+

| id | gid | col1 | col2 |

+----+------+------+------+

| 6 | A | 29 | 97 |

| 15 | E | 14 | 86 |

| 24 | D | 54 | 79 |

| 28 | C | 34 | 90 |

| 32 | B | 4 | 90 |

+----+------+------+------+

2) N=3 取GID每组 COL2最大的3条记录

+----+------+------+------+

| id | gid | col1 | col2 |

+----+------+------+------+

| 6 | A | 29 | 97 |

| 11 | A | 2 | 78 |

| 36 | A | 39 | 75 |

| 32 | B | 4 | 90 |

| 2 | B | 25 | 83 |

| 12 | B | 30 | 79 |

| 28 | C | 34 | 90 |

| 23 | C | 46 | 84 |

| 13 | C | 96 | 73 |

| 24 | D | 54 | 79 |

| 4 | D | 63 | 56 |

| 9 | D | 25 | 43 |

| 15 | E | 14 | 86 |

| 25 | E | 85 | 64 |

| 20 | E | 80 | 63 |

+----+------+------+------+

过程不阐述了,得到的最优算法是SELECT gid,col2,1 INTO @i,@j,@mc FROM t2v LIMIT 1;

SELECT id,gid,col1,col2 FROM (

SELECT a.id,a.gid,a.col1,a.col2,

IF(@i<>gid,@mc:=1,@mc) AS a2,

IF(@i<>gid,@i:=gid,@i) AS b1,

IF(@i=gid AND col2>=@j,@mc:=@mc+1,@mc) AS a1

FROM t2v a

ORDER BY gid,col2 DESC) aa

WHERE a2<=3

如果还加上索引,这个语句的查询效果还是非常给力的,该语句支持单一字段数据重复,或者多字段重复,并且支持重复数据显示N条,例子语句为3条

不过后来发现,在PHP的函数mysql_query中悲剧了,不支持一次执行多条语句,简单的很,数组搞定,如下

最后在来一个变通了一下SQL语句,一句话搞定,不错,效率比上面的那个来稍微查一点。SELECT a.id,a.gid,a.col1,a.col2 FROM t2v a

LEFT JOIN t2v b

ON a.gid=b.gid AND a.col2<=b.col2

GROUP BY a.id,a.gid,a.col1,a.col2

HAVING COUNT(b.id)<=3

ORDER BY a.gid,a.col2 desc

mysql 过滤相同数据库_MySQL数据库查询中的重复记录过滤相关推荐

  1. mysql查询删除重复记录查询_mysql怎么查询和删除重复记录

    查找所有重复标题的记录: SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > ...

  2. mysql反弹提权_MySQL数据库反弹端口连接提权

    [51CTO.com原创稿件]在渗透或者安全评估时,有可能遇到一些比较奇葩的环境,即使通过Mysql root账号和密码获取了webshell,由于无法执行命令.在一般的情况下,也就放弃了.但其实可以 ...

  3. 在 MySQL 数据库中删除重复记录的步骤

    在 MySQL 数据库中删除重复记录的步骤 当我们在处理数据库中的数据时,有时候会出现重复记录的情况,这些重复记录会影响数据的正确性,需要将其删除.下面是在 MySQL 数据库中删除重复记录的步骤: ...

  4. mysql 创建重复数据库_MySQL数据库,如何处理重复的数据?

    前言 这是一个基本问题,这篇文章是我很早之前遇到的一种情况,后来在学习视频的时候又遇到了一次,因此给出一个总结.其实解决能否插入重复数据的问题,一般情况下是有两个思路,就像治水一样,第一个就是从源头, ...

  5. 查询数据库中的重复记录

    ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid from adam_entity_d ...

  6. mysql删除重复文章标题_MySQL中查询、删除重复记录的方法大全

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: 一.查找重复记录 1.查找全部重复记录 2.过滤重复记录( ...

  7. mysql删除重复的判断_MySQL中查询、删除重复记录一共有多少种方法?

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as coun ...

  8. mysql去掉两个最高分_MySQL中查询、删除重复记录的方法大全

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as coun ...

  9. MySQL开发技巧 第二禅(子查询中匹配两个值、解决同属性多值过滤的问题、计算累进税的问题)

    一.如何在子查询中匹配两个值 mysql子查询的使用场景及其好处 1.什么是子查询?             当一个查询是另一个查询的条件时,称之为子查询(可以在curd中) 2.常见的子查询使用场景 ...

最新文章

  1. LeetCode简单题之唯一摩尔斯密码词
  2. 如何学习Python课程
  3. 云计算是怎样入侵统一通信领域的
  4. linux创建管道的函数,Linux下的有名管道(03)---使用函数创建和删除有名管道
  5. Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors
  6. P4 用verilog描述单周期CPU的学习笔记和总结(基于P3)
  7. linux 中gnu的含义是,GNU是什么意思
  8. 电脑状态栏中,声音图标不见了怎么办?三招帮你找回!
  9. 怎么把分开的pdf放在一起_PDF多页合并为一页的方法是什么 怎么将PDF文件拆分成单页...
  10. 简单 Quartz定时器使用 入门
  11. Matlab裁剪图像
  12. python入门教程慕课网_秒懂系列 | 史上最简单的Python Django入门教程
  13. win配置pm2开机自启node项目
  14. arduino mega针脚_Arduino MEGA串口TX1、RX1使用方法
  15. Python制作回合制手游外挂简单教程(中)
  16. 银行ATM存取款页面简易版练习(python)
  17. linux人必须知道之人
  18. SCO UNIX 讲座
  19. 【转载】极大似然估计
  20. 福大软工1816 - 404 Note Found选题报告

热门文章

  1. 带有Jersey和Spring的RESTful Web应用程序
  2. Java 打 jar 包时,MANIFEST.MF 文件详解
  3. 如何开发 Servlet 程序
  4. ASCII编码/Unicode编码
  5. HH SaaS电商系统的供应商系统设计
  6. db2 springboot 整合_[SpringBoot]快速配置多数据源(整合MyBatis)
  7. 【技术解决方案】GitHub本地仓库管理与远程仓库管理
  8. 多线程程序中操作的原子性
  9. C++学习 | 面试官:我们只想要这样的C++工程师
  10. grad在python什么模块_深度学习(Deep Learning)基础概念1:神经网络基础介绍及一层神经网络的python实现...