北京SEO

mysql中distinct去除重复值方法

2019/10/10/17:34:07  阅读:2100  来源:谷歌SEO算法  标签: DNS

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段.

而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题

mysql的DISTINCT的关键字有很多你想不到的用处

1.在count 不重复的记录的时候能用到,比如SELECT COUNT( DISTINCT id ) FROM tablename;就是计算talbebname表中id不同的记录有多少条

2,在需要返回记录不同的id的具体值的时候可以用,比如SELECT DISTINCT id FROM tablename;返回talbebname表中不同的id的具体的值

3.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义,比如SELECT DISTINCT id, type FROM tablename;

实际上返回的是 id与type同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得id与tyoe都相同的才被排除了,与我们期望的结果不一样.

例,代码如下:

  1. CREATETABLE`student`(
  2. `name`varchar(20)NOTNULLDEFAULT'',
  3. `age`int(10)DEFAULT'0'
  4. )ENGINE=InnoDBDEFAULTCHARSET=latin1
  5. --1.测试一
  6. select*fromstudent;
  7. a5
  8. a5
  9. c0

用distinct过滤掉两列都相同的记录,代码如下:

  1. selectdistinctname,agefromstudent;
  2. --返回
  3. a5
  4. c0

2.测试二

将表student的数据改为如下,代码如下:

  1. select*fromstudent;
  2. c2
  3. c5
  4. selectdistinctname,agefromstudent;

返回如下,说明distinct后面有多于一列的字段时,只有每列的值完全相同才过滤.

c 2

c 5

3.测试三,代码如下:

  1. select*fromstudent;
  2. nameageheight
  3. --phpfensi.com
  4. c2123
  5. c2456
  6. b20222

group by按两列同时分组,代码如下:

  1. selectname,age,sum(height)fromstudentgroupbyname,age;
  2. b20222
  3. c2579

group by按两列同时分组,同时在后面加上having的条件,代码如下:

select name,age,sum(height) as n from student group by name,age having n > 500;

返回:c 2 579

4.测试四

关于group by后面limit的测试,代码如下:

  1. selectsongname,sengerid,count(sengerid)asnfromt_songgroupbysongname,sengeridhavingn>1ORDERBYnDESC,songidASClimit10;
  2. 未知873840
  3. 共同渡过143224
  4. 风继续吹143223
  5. 倩女幽魂143223
  6. 无心睡眠143223
  7. 罗百吉超嗨派对连续组曲78019
  8. 拒绝再玩143219
  9. 风再起时143218
  10. 每天爱你多一些148018
  11. 千言万语179418
  12. selectsongname,sengerid,count(sengerid)asnfromt_songgroupbysongname,sengeridhavingn>1ORDERBYnDESC,songidASClimit5;
  13. 未知873840
  14. 共同渡过143224
  15. 风继续吹143223
  16. 倩女幽魂143223
  17. 无心睡眠143223

经过以上两个测试可以看出,如果sql语句中含有limit,limit是对用group by进行分组,并进行相关计算以后的limit操作,而不是对limit后面的指定记录数进行分组,从n那一列的数据每一行的值都大于10就可以看出来.

5.测试五

用以下的两种形式的distinct均可以得到相同的记录数,写法不一样,结果是一样的,代码如下:

select count(distinct(songid)) from feedback;

select count(distinct songid) from feedback;

6.测试六

field singername is string,max(singername),如果singername有些列为空,有些列不为空,则max(singername)取非空的值,如果一列为zxx,一列为lady,则取zxx,按字母顺利取的,代码如下:

select feedback_id,songid,songname,max(singername),max(time) as new_time from feedback group by songid order by new_time desc;

7.Sql语句中where,group by,order by及limit的顺序

where xxx,group by xxx,order by xxx,limit xxx

8.关于group by与count的问题

如果sql语句中含有group by,则最好不要将count sql转换为select count(*) from xxx,否则select与from之间的字段很有可能是后面要使用的,代码如下:

  1. selectfeedback_id,songid,songname,max(singername),max(time)asnew_timefromfeedbackgroupbysongidorderbynew_timedesc;
  2. MySQLQueryError:SELECTCOUNT(*)FROMfeedbackGROUPBYsongidORDERBYnew_timeDESCErrorInfo:Unknowncolumn'new_time'in'orderclause'

广告内容

mysql中distinct去除重复值方法 mysql中distinct去除重复值方法 mysql中distinct去除重复值方法

相关阅读

热门评论

小潘seo 小潘seo

重庆小潘seo博客和你一起学习SEO知识,共同分享SEO优化~

总篇数165

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法