求助大神,数据库查询结果的去重除了distinct关键字,还有啥别的方法没?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助大神,数据库查询结果的去重除了distinct关键字,还有啥别的方法没?相关的知识,希望对你有一定的参考价值。

  一般情况下,数据库去重复有以下那么三种方法:

第一种:

  两条记录或者多条记录的每一个字段值完全相同,这种情况去重复最简单,用关键字distinct就可以去掉。例:

SELECT DISTINCT * FROM TABLE

第二种:

  两条记录之间之后只有部分字段的值是有重复的,但是表存在主键或者唯一性ID。如果是这种情况的话用DISTINCT是过滤不了的,这就要用到主键id的唯一性特点及group by分组。例:

SELECT * FROM TABLE WHERE ID IN (SELECT MAX(ID) FROM TABLE GROUP BY [去除重复的字段名列表,....])

第三种:

  两条记录之间之后只有部分字段的值是有重复的,但是表不存在主键或者唯一性ID。这种情况可以使用临时表,讲数据复制到临时表并添加一个自增长的ID,在删除重复数据之后再删除临时表。例:

//创建临时表,并将数据写入到临时表
SELECT IDENTITY(INT1,1) AS ID,* INTO NEWTABLE(临时表) FROM TABLE
//查询不重复的数据
SELECT * FROM NEWTABLE WHERE ID IN (SELECT MAX(ID) FROM NEWTABLE GROUP BY [去除重复的字段名列表,....])
//删除临时表
DROP TABLE NEWTABLE

参考技术A 1. 2个结果进行union 时,也可以去重
2. group by 也可以去重本回答被提问者和网友采纳
参考技术B 用limit 0显示1位

记录一些细节

1.Thinkphp的distinct(field)查询数据库用作查询去重时,如果后面加上order则是对distinct检索出来的结果进行排序,而不是先排序再distinct去重,曾经想通过order对检索结果进行顺序控制,发现失败!切记~~~~

2.array_unique数组去重,当初想对一个二维数组进行处理的时候,发现错误!感觉有点郁闷。预处理数据为:[[1=>123, 2=>321], [1=>321, 2=>123]],从表面上看,应该保留两个信息,没想到两个都去掉了,仔细一看手册,发现是直接把数组转化为字符串比较,这样的话,多维数组下面,只看第一维,后面的都转为Array,这样看,还真的是一样。本人测试了一下,还真的是。。。以下是测试数据

$data = [[1=>123, 2=>321], [1=>321, 2=>123, 3=>666], 3=>4];
foreach($data as $k => $v)dump((string)$v);
dump(array_unique($data));
结果:

 

 








结果显示与猜测一致。。。只能说我太天真!调试了很久,就当买个教训吧!

以上是关于求助大神,数据库查询结果的去重除了distinct关键字,还有啥别的方法没?的主要内容,如果未能解决你的问题,请参考以下文章

数据库中的distinct关键字(去重)

Oracle的去重函数 distinct

Elasticsearches 查询 去重

求教mongoDB怎么实现分组去重

常用的去重和排序

数据库笔记02