MySQL去除查询数据库重复结果

java_man 贡献于2011-11-10

作者 李媛媛  创建于2011-04-01 16:33:01   修改者  修改于1899-12-30 00:00:00字数3218

文档摘要:在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙。
关键词:

查询数据库的结果有重复,怎么办? 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是我们两人都郁闷了。。。。。。。。。 下面先来看看例子: ---------------------------------------------------------------------------------------------------------------------- -- 表的结构 `member` -- CREATE TABLE IF NOT EXISTS `member` ( `uid` int(7) NOT NULL AUTO_INCREMENT, `username` varchar(8) DEFAULT NULL, `telephone` varchar(11) DEFAULT NULL, PRIMARY KEY (`uid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2003879 ; ----------------------------------------------------------------------------------------------------------------------- -- 转存表中的数据 `member` -- INSERT INTO `member` (`uid`, `username`, `telephone`) VALUES (2003875, 'qsdcz', '12345678902'), (10034, 'asdf', '13989775873'), (10023, 'qwer', '13989775873'), (10039, 'edcvfr', '13267864587'), (2003874, '234jhkus', '18701395130'), (10982, '234jhkus', '18783493002'), (12234, 'cfdfv', '13687879832'), (2003876, NULL, '12345678901'), (2003877, 'wertyuu', '12345678901'), (2003878, 'rtyuijkd', '12345678901'); ----------------------------------------------------------------------------------------------------------------------- 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。 比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。 select distinct telephone from table 得到的结果是:    telephone的结果是:    12345678901    12345678902    13267864587 13687879832 13989775873 18701395130 18783493002 好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧: select distinct telephone,uid,username from table 结果会是: uid username telephone 2003875 qsdcz 12345678902 10034 asdf 13989775873 10023 qwer 13989775873 10039 edcvfr 13267864587 2003874 234jhkus 18701395130 10982 234jhkus 18783493002 12234 cfdfv 13687879832 2003876 sdf 12345678901 2003877 wertyuu 12345678901 2003878 rtyuijkd 12345678901 distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。 我们再改改查询语句: select id, distinct name from table 很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。 很麻烦吧?确实,费尽心思都没能解决这个问题。没办法,继续找人问。 拉住公司里一JAVA程序员,他给我演示了oracle里使用distinct之后,也没找到mysql里的解决方案,最后下班之前他建议我试试group by。 试了半天,也不行,最后在mysql手册里找到一个用法,用group_concat(distinct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快试试。 报错。。。。。。。。。。。。郁闷。。。。。。。连mysql手册也跟我过不去,先给了我希望,然后又把我推向失望,好狠哪。。。。 再仔细一查,group_concat函数是4.1支持,晕,我4.0的。没办法,升级,升完级一试,成功。。。。。。 终于搞定了,不过这样一来,又必须要求客户也升级了。 突然灵机一闪,既然可以使用group_concat函数,那其它函数能行吗? 赶紧用count函数一试,成功,我。。。。。。。想哭啊,费了这么多工夫。。。。。。。。原来就这么简单。。。。。。 现在将完整语句放出: select *, count(distinct telephone) from table group by telephone 结果:    uid username telephone 2003878 rtyuijkd 12345678901 2003875 qsdcz 12345678902 10039 edcvfr 13267864587 12234 cfdfv 13687879832 10023 qwer 13989775873 2003874 234jhkus 18701395130 10982 234jhkus 18783493002 最后一项是多余的,不用管就行了,目的达到。。。。。 唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧,现在拿出来希望大家不要被这问题折腾。 哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错,差不多了,我继续忙碌。。。。。。 案例代码:
uid username telephone

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档