mysql中distinct的⽤法
本事例实验⽤表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查询请参考:
对distinct的原理及优化分析的很好,⼤家可以查看。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论