转一个distinct用法,很有帮助

转一个distinct用法,很有帮助

(2011-12-01 15:18:11)

转载

标签:

杂谈

分类: mysql复制

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有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实现了我所需要的功能,兴奋,天佑我也,赶快试试。

报错,再仔细一查,group_concat函数是4.1支持,升完级一试,成功。

突然灵机一闪,既然可以使用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之前,不然会报错

时间: 2024-10-27 05:27:38

转一个distinct用法,很有帮助的相关文章

拷贝被人的drawRect绘图分类用途、用法很全。

拷贝被人的drawRect绘图分类用途,用法很全.留着.供用时参考 // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(

distinct用法

distinct可以列出不重复的记录,对于单个字段来说distinct使用比较简单,但是对于多个字段来说,distinct使用起来会使人发狂.而且貌似也没有见到微软对distinct使用多字段的任何说明.下面就提供了一种方法可以在使用distinct的时候同时使用多个字段. select 要使用字段1,要使用字段2 from 表名 where id in (select min(id) from 表名 group by 不重复字段名) 例: select byid,id from bbs whe

关于结构体的一个特殊用法(总觉得遇到的问题就该记录一下哇)

关于结构体的一个特殊用法 //写法一 struct array { int count; char *buf; } //写法二 struct array { int count; char buf[0]; } 如果一个buf用作一个buffer的话,这时候如果malloc一块内存, 用方法一,buf是指针的话,指向这块申请出的内存的话,这里array结构体和buf指向的buffer就是分开的. 而用方法二的时候,申请出的buffer和结构体buffer是连接在一起的. 这么说有点抽象. 非常感谢

EF错误:无法加载关系xxx,因为类型xxx不可用。以下信息对于解决上一个错误可能很有用: 类型xxx中不存在必需属性xxx

工作中遇到下面错误: 指定的架构无效.错误: 无法加载关系“Centria.ABATracker.Domain.FK_ABC_TherapySession_SessionId”,因为类型“Centria.ABATracker.Domain.TherapySession”不可用. 以下信息对于解决上一个错误可能很有用: 类型“Centria.ABATracker.Domain.TherapySession”中不存在必需属性“SessionTargetTARecord”. 无法加载关系“Centri

记录一个python里面很神奇的操作,对一个包含列表的元组进行增量赋值,成功赋值但还报错

记录一个python里面很神奇的操作 今天记录一个很神奇的操作.关于序列的增量赋值.如果你很熟悉增量赋值,你也不妨看下去,我想说的是有关于增量赋值和元组之间一种神奇的操作.来自 <流畅的Python> 一书,让我们更加深入地了解里面的原理 神奇的操作 >>>t = (1,2,[30,40]) >>>t[2] += [50,60] 上面这段代码会出现什么样的情况 a. t会变成(1,2,[30,40,50,60]) b. 因为tuple不支持对它的元素赋值,所

王金战:改变一个差生真的很简单

当一个学生,反复遭遇失败的打击,他就变成了差生,没有一个学生生下来就注定是个差生.所以让一个差生变好真的很简单.    我刚参加工作的时候,不敢说这句话,但是我现在敢说,因为我多年的经历已经证明了这件事情.让一个差生变好真的很简单,怎么做呢?就是反其道而行之.差生是反复遭遇失败的打击后才产生的,让一个差生变好,就是让他反复享受到成功的喜悦,这个学生就会慢慢地变好了.    少年来我就用这样的方法和理念,帮着一个个学生走出困境,走向成功.我深深体会到,作为教师,作为家长,要学会欣赏孩子.特别是对那

万百腾玩O2O笑话一个——看起来很美,注定没下文

据说 2014.8.29:中国最大商业运营商万达联手互联网服务商百度.腾讯在深圳(楼盘)举行战略合作签约仪式. 从功能表面上,万达代表实体,百度代表数据,腾讯代表社区:按三个合伙人理解,是要打通实体数据社区之前的联系.嗯,冠冕堂皇的看法和理解自然博得媒体的关注. 若从深层次来看,万百腾玩O2O就是笑话一个,注定没有下文! 若大的中国零售市场,就你三家的理解可以搞出来的话,那么当马云不存在吗? 本博分析,三家玩O2O本质上说明万建林就是一个跨行的文盲,注定要输给马云. 接下来,我们分析下万达及万建

string array的一些小总结(初学者可以看一看,string array的用法很重要,用处很多)

string的总结 charat 用法:n = String.charAt(string, index):传入的是一个字符串和一个数字:列:var a = String.charAt("world",2);var b = String.charAt("world",0);var c = String.charAt("world",10);产生的结果就是a = "r"b = "w"c = "&quo

有关findviewbyid 一个错误用法

首先这个函数的功能是根据参数id 来返回一个对应的view . 网上是这样说的:  Android中FindViewById()是一个非常常用的函数,位于android.app.Activity包中.该函数利用我们在XML文件中定义的View的id属性来获取相应的View对象. 但是这个函数默认的调用布局是Activity的,即 xxx = (xxx)this.findviewbyid(id) : 这样只能找到activity的布局文件里的id (布局文件即你setContentView(R.l