2017-11-28MySQL中去重 distinct 的用法 ,数据库去重distinct

您现在的位置是: 首页 > MySQL技术 > MySQL中去重 distinct 的用法 ,数据库去重distinct

1112次阅读

一、distinct 位置


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

mysql>SELECT nickname,DISTINCT(openid) from ims_ewei_shop_member;

[SQL] SELECT nickname,DISTINCT(openid) from ims_ewei_shop_member;
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 'DISTINCT(openid)
 from ims_ewei_shop_member' at line 1


2. 现在把distinct放在开头

SELECT DISTINCT(openid),nickname from ims_ewei_shop_member;

# 查询成功


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

SELECT nickname,count(DISTINCT(openid)) from ims_ewei_shop_member;

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


二、distinct用法


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

SELECT COUNT(DISTINCT(openid)) from ims_ewei_shop_member;

# 就是计算ims_ewei_shop_member表中openid不同的记录有多少条


2. 在需要返回记录不同的如openid等具体值的时候可以用

SELECT DISTINCT(openid) from ims_ewei_shop_member;

# 返回ims_ewei_shop_member表中不同的openid的具体的值


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

# 无论是
SELECT DISTINCT(openid),nickname from ims_ewei_shop_member;
# 还是
SELECT DISTINCT openid,nickname from ims_ewei_shop_member;

# 特别注意:
# 实际上返回的是openid与nickname 同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得openid和nickname都相同的才被排除了,与我们期望的结果不一样,我们期望的是openid不同被过滤
# 在这种情况下,distinct同时作用了两个字段,openid,nickname
# 这时候可以考虑使用group_concat() 函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的

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


用distinct的时候,如果它有索引,mysql会把它转成group by的方式执行