使用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的相识照旧太浅薄了,不怕被笑话,收归来回头让人人别犯异样的错误。。。。。。




版权声明: 原创作品,答应转载,转载时请务必以超链接情势标明文章 原始来由 、作者信息和本声明。不然将清查法律责任。

posted @ 2011-03-08 00:40  蓝色的天空III  阅读(224)  评论(0编辑  收藏  举报