博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql DISTINCT问题
阅读量:5064 次
发布时间:2019-06-12

本文共 2005 字,大约阅读时间需要 6 分钟。

问题描述

因为要设计一个数据库表,进行一个倒序去重的操作。

例如:

id

Name

1

B

2

A

3

A

4

C

5

C

6

B

场景:例如说我们需要得到一个用户的搜索记录,那么肯定不会仅仅根据时间倒序排序给出列表展示,因为这样会出现重复的问题。我们需要去重,并且保证用户对一个搜索记录是按照最后一次搜索操作的时间排序的。

用以上用例去描述,id为添加顺序,Name为查询记录,我们需要Sql查询的结果为BCA。

一开始选择使用了DISTINCT方式。然而实践过程中,DISTINCT方案是行不通的。

原因

我们是不是会认为这个仅仅是需要DISTINCT Name去重加上ORDER BY id DESC 就解决了呢?

SELECT DISTINCT(Name) from table Order by id DESC

 

首先,这样做是没有意义的。因为DISTINCT操作会先于Order by 操作,id的列已经不见了,Order by 只能指定显示列名。况且已经进行了DISTINCT去重操作了,Name与id不是唯一对应关系,排序当然也无从谈起了。(这样写在不同的机器上据说表现情况不一样,有些会直接报错,我的没有)

附上一下Mysql语句执行顺序

 
(7)     SELECT(8)     DISTINCT 
(1) FROM
(3)
JOIN
(2) ON
(4) WHERE
(5) GROUP BY
(6) HAVING
(9) ORDER BY
(10) LIMIT

 

 

 

那么可不可以先排序出子表,再用DISTINCT去重呢?

SELECT DISTINCT(Name) from (Select * from table Order by id DESC)tb1
 

实验结果不满足要求,并且结果很奇怪,是一个莫名其妙的顺序(顺序既不是正序,也不是倒序,也不是降序,加了limit结果又会不一样)。

这条语句能否成功的关键点,就在于DINSTINCT的顺序是否与原表的顺序有关。

在查看了很多文章后,我都没有看到对这个知识点的描述。但是最后我翻到了一些其他的东西。

 

有一位使用Sql server的先生这样写

 
实事求是的讲,就现在我遇到的情况,如果distinct 不写order by 的话,实际结果集的输出顺序依赖于两个条件。​1、生成的查询计划的顺序(在不同版本的sql server 解释同一个语句的执行计划会有所不同,统计信息不同也会有所不同)​2、数据存储和访问的顺序 (这个要看是否有索引等)还是需要具体情况,具体分析的。​个人愚见,参考

 

 

 

还有一位先生这样写

 
没有order by子句的所有查询都不保证顺序,即使有聚集索引​因为优化器可能会选择并行处理,或者在多文件情况下不按“期待”顺序扫描数据,所以无法保证数据的顺序。唯一能确保顺序的只有order by。distinct内置是需要排序然后去重的,但是最终结果可能又会乱掉。另外根据sqlserver排序规则,不同的排序规则也有不同的结果

 

我还看到了Mysql的使用者也提出过,同样的Mysql,同样的sql语句,得出的查询结果出现了顺序不同的问题。

 

最后我觉得可以初步得出这个结论:虽然没有得出Mysql究竟是以怎样的算法进行的排序,怎样的算法实现DISTINCT操作(考虑到各版本,各引擎实现方法可能还不同,这个工作量可能非常的大),但是因为出现了无序的情况,就可以说任何没有Order By子句的查询都不能保证顺序,所以这个需求,以DISTINCT语句不能实现。

 

DISTINCT一般用来:1.去重拿结果。2.统计数目。其他的需求暂时就不要考虑这个了,Group by比较好用,一般效率也不差DISTINCT,甚至会更高。

 

实现该需求应该用Group by。

 
 
Select Name from table group by Name order by max(id) desc

 

但是这样会出现有一个无法用到id索引的问题,最后没有办法,只能改变表结构去实现了,如果拥有可以不用改变表结构就能实现并且能完全走索引的方法的同学,欢迎指导,我请你喝肥宅快乐水。

 

转载于:https://www.cnblogs.com/coder-chi/p/9376658.html

你可能感兴趣的文章
JS模块化库seajs体验
查看>>
Android内核sysfs中switch类使用实例
查看>>
POJ2288 Islands and Bridges(TSP:状压DP)
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
IOS开发UI篇--UITableView的自定义布局==xib布局
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
Unrecognized Windows Sockets error: 0: JVM_Bind 异常解决办法
查看>>
struts2中<s:form>的应用
查看>>
QML学习笔记之一
查看>>
7NiuYun云存储UploadPicture
查看>>
Window 的引导过程
查看>>
python与 Ajax跨域请求
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
贪吃蛇游戏改进
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
在WPF中使用Caliburn.Micro搭建MEF插件化开发框架
查看>>