运用distinct在mysql中究诘多条不反复记录值的处置责罚办法

  来源:网海拾贝




在运用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的领会照样太浅陋了,不怕被笑话,收回来让年夜家别犯异常的错误。。。。。。




版权声明: 原创作品,容许转载,转载时请务必以超链接方式标明文章 原始来由 、作者信息和本声明。否则将追究执法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1976006.html