起原:网海拾贝
在使用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的相识照旧太浅薄了,不怕被笑话,收归来回头让人人别犯异样的错误。。。。。。
版权声明: 原创作品,答应转载,转载时请务必以超链接情势标明文章 原始来由 、作者信息和本声明。不然将清查法律责任。