mysql distinct语句去除重复数据用法

发布时间:2020-01-26编辑:脚本学堂
有关mysql distinct语句的用法,在mysql查询中,select distinct去除重复数据的技巧,单独的distinct只能放在开头,否则报错,语法错误。

用表task,结构:
 

复制代码 代码示例:
mysql> 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;
 

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

二,distinct用法
1,在count计算不重复的记录的时候能用到
比如

复制代码 代码示例:
select count( distinct player_id ) from task;
 

就是计算talbebname表中id不同的记录有多少条

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

复制代码 代码示例:
select distinct player_id from task;
 

返回talbebname表中不同的id的具体的值

3,以上情况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

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

5、另外一种方式:
 

复制代码 代码示例:
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