博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql distinct 用法详解及优化
阅读量:6948 次
发布时间:2019-06-27

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

本事例实验用表task,结构如下

 > desc task;

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

| Field       | Type       | Null | Key | Default           | Extra |

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

| PLAYER_ID   | bigint(20) | NO   | PRI | NULL              |       |

| TASK_ID     | int(11)    | NO  | PRI | NULL              |       |

| TASK_STATUS | tinyint(4) |NO   |    | NULL              |       |

| CREATE_DATE | datetime   | YES |     | NULL              |       |

| UPDATE_DATE |timestamp  | NO   |    | CURRENT_TIMESTAMP |       |

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

  

1  Distinct 位置

  单独的distinct只能放在开头,否则报错,语法错误

mysql> Select  player_id,distinct(task_id) from task;

ERROR 1064 (42000): You havean error in your SQL syntax; check the manual that

corresponds to your MySQLserver version for the right syntax to use near 'disti

nct(task_id) from task' atline 1

现在把distinct放在开头

mysql> Select  distinct(task_id),taskid from task;

查询成功

与其他函数使用时候,没有位置限制如下

  Select player_id,count(distinct(task_id))from task;

这种情况下是正确的,可以使用。

2  Distinct用法

a.在count计算不重复的记录的时候能用到

比如SELECT COUNT( DISTINCT player_id ) FROM task;
就是计算talbebname表中id不同的记录有多少条

b,在需要返回记录不同的id的具体值的时候可以用

比如SELECT DISTINCT player_id FROM task;
返回talbebname表中不同的id的具体的值

c.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义

比如SELECT DISTINCT player_id, task_id FROM task;
实际上返回的是player_id与task_id同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得player_id与task_id都相同的才被排除了,与我们期望的结果不一样,我们期望的是player_id不同被过滤

  在这种情况下,distinct同时作用了两个字段,player_id,task_id

d.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的

e. 其实还有另外一种解决方式,就是使用

SELECT player_id, task_id, count(DISTINCT player_id) FROM task.
虽然这样的返回结果多了一列无用的count数据(有时也许就需要这个数据)

f 同时我们还可以利用下面的方式解决b遇到的歧义问题通过group by 分组

  select player_id,task_id from task group by player_id

distinct 优化

请参考:

对distinct的原理 及优化分析的很好,大家可以查看。

转载于:https://www.cnblogs.com/wajika/p/6745462.html

你可能感兴趣的文章
记一次服务器被恶意攻击的情况
查看>>
一个例子:HelloWorld
查看>>
排序算法及分析(插入、希尔、选择、冒泡)
查看>>
[转]Redmine 配置163邮箱
查看>>
C#--属性
查看>>
文本自动分割算法
查看>>
http://blog.csdn.net/i_bruce/article/details/39555417
查看>>
shell 调试手段总结
查看>>
CSharpGL(17)重构CSharpGL
查看>>
AVFoundation播放视频时显示字幕,切换音轨
查看>>
Spark笔记:复杂RDD的API的理解(上)
查看>>
java单例设计模式
查看>>
Druid.io索引过程分析——时间窗,列存储,LSM树,充分利用内存,concise压缩
查看>>
【emWin】例程十六:窗口管理器
查看>>
HTTP 403详解
查看>>
WPF实现在电脑重启或关机时执行某些逻辑
查看>>
PCA(主成分分析)的简单理解
查看>>
[Asp.net web api]缓存
查看>>
结构化、半结构化和非结构化数据
查看>>
thinkPHP 快速上手
查看>>