有关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