来源:网海拾贝
在运用mysql时,有意偶尔需求究诘出某个字段不反复的记录,虽然mysql供给有distinct这个关键字来过滤掉多余的反复记录只留存一条,但往往只用它来前往不反复记录的条数,而不是用它来前往不重记录的完好值。其缘由是distinct只能前往它的目标字段,而无法前往另外字段,这个题目让我困扰了很久,用distinct不克不及处置责罚的话,我只需用二重轮回究诘来处置责罚,而如许对于一个数据量异常年夜的站来说,无疑是会间接影响到遵命的。以是我花了很多时分来研讨这个题目,网上也查不到处置责罚方案,时期把容容拉来协助,效果是我们两人都郁闷了。。。。。。。。。
下面先来看看例子:
table
id name
1 a
2 b
3 c
4 c
5 b
库布局梗概如许,这只是一个复杂的例子,抱负环境会重年夜得多。
比如我想用一条语句究诘获得name不反复的完好数据,那就必需运用distinct去掉多余的反复记录。
select distinct name from table
获得的效果是:
name
a
b
c
似乎到达效果了,可是,我想要获得的是id值呢?改一下究诘语句吧:
select distinct name, id from table
效果会是:
id name
1 a
2 b
3 c
4 c
5 b
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 name) from table group by name
效果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
末端一项是多余的,不用管就行了,目标到达。。。。。
唉,本来mysql这么笨,暗暗一下就把他骗过来了,郁闷也就我吧(对了,另有容容那家伙),如今拿出来进展年夜家不要被这题目折腾。
哦,对,再特地说一句,group by 必需放在 order by 和 limit之前,否则会报错,差未几了,发给容容放网站上去,我承继繁忙。。。。。。
-----------------------------------------------------------------------------------------
更郁闷的任务产生了,在预备提交时容容发明,有更复杂的处置责罚办法。。。。。。
select id, name from table group by name
看来对mysql的领会照样太浅陋了,不怕被笑话,收回来让年夜家别犯异常的错误。。。。。。
版权声明: 原创作品,容许转载,转载时请务必以超链接方式标明文章 原始来由 、作者信息和本声明。否则将追究执法责任。