Select中DISTINCT关键字的用法?

在使用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之前,不然会报错,差不多了,发给容容放网站上去,我继续忙碌。。。。。。

posted on 2007-04-17 11:17 youngturk 阅读(69548) 评论(36)  编辑  收藏 所属分类: Oracle

评论

# re: Select中DISTINCT关键字的用法? 2007-10-23 16:08 乔乔

你好,
我用的是ACCESS做为数据库,同样是数据库里有重复的信息,查询时想同一公司的信息只显示一条,但是我想得到的是公司的整体情况,
connsousuoSQL="SELECT *, count(distinct G_webname) FROM G_user Where G_webname like '%"&txtitle&"%' group by G_webname"

用了你的方法(如上语句)后还是出错,

麻烦你指点一下

谢谢  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2007-10-23 16:17 乔乔

你好,
我用的是ACCESS做为数据库,同样是数据库里有重复的信息,查询时想同一公司的信息只显示一条,但是我想得到的是公司的整体情况,
connsousuoSQL="SELECT *, count(distinct G_webname) FROM G_user Where G_webname like '%"&txtitle&"%' group by G_webname"

用了你的方法(如上语句)上传到网上,网站搜索后还是出错,

麻烦你指点一下

谢谢  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2008-01-05 13:47 nothing

你这样选择出来的数据本身逻辑就有问题,对于c,它对应的ID有好几个,你希望选择出来的是哪个ID呢?在严格应用时,这种选择逻辑就有错误  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2008-04-11 16:26 aaa

//查看最近访客情况
$sqlCaller="select caller_id from caller where mem_id=".$blogID." group by caller_id order by c_time DESC limit 0,30";  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2008-05-19 16:55 详详细细

select *, count(distinct name) from table group by name
这样也行? group by 能这么用?  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2008-05-27 15:44 chinetman

select distinct(列名) from 表名 order by 列名  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2008-07-09 10:42

不行!  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2008-07-18 19:05 sk.lee

我想知道具体表的信息能知道麽,进来忙没常来光顾..  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2008-08-29 22:53 heyse

使用group by和聚合函数
select name,MAX(ID) AS ID from tName group by name
go
  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2009-03-02 09:57 w~~

select distinct 1,2 from table group by 1;
同样是在table中查询不同的1的1,2字段,也能实现需要的功能  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2009-08-19 13:58 qqq

不错的笑话题材
当回好人吧
select *, count(distinct name) from table group by name
这条SQL有脱裤子放屁的感觉,要是想得要楼主说的结果可以直接这么写
select * from table group by name
与distinct有啥关系?
大家最好先了解一下group by的功能 楼主现在应该成长了,也不来改正这愚蠢的错误。  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2009-09-04 11:38 jun

不错,我也是遇到这样的问题,谢谢你给我找到了你的办法。
真的可以骗得过去哦!^.^  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2009-09-13 11:10 aaa

select * from table group by name  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2009-09-13 11:11 aaa

不好意思,貌似ls某位兄弟已经说了,没认真看评论=。。=  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2009-10-14 16:53 lzp

真无语
用这么麻烦吗楼主???
select * from table group by name;
直接搞定.  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2009-12-12 22:11 4321

group by name了还可以select * ???????  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2010-04-01 14:03 不会游泳的鱼

@qqq
不懂的不要乱评论,免得误导别人....真无语,评论之前自己也不知道试下.还阵阵有词  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2010-04-01 18:37 melon

select * from table group by name having count(distinct(name))=1  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-04-10 16:59 luo

group by name 对应 select * ? 语法太高级了吧  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2010-04-11 10:46 游客

操你妈的一群不负责、水平差、不懂装懂的垃圾,对技术性文章发表评论的时候负责点好吗?浪费老子时间。
  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2010-04-22 10:16 周青

select name,id from table where id in
(select min(id) from table group by name)  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-07-18 08:57 不懂

试了又试,还是不行,  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-07-18 09:05 不懂

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用

  select distinct * from tableName

  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

  select distinct * into #Tmp from tableName

  truncate table tableName

  select * into tableName from #Tmp

  drop table #Tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

  select identity(int,1,1) as autoID, * into #Tmp from tableName

  select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

  select * from #Tmp where autoID in(select autoID from #tmp2)

  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-08-18 16:24 小虾米

select a.id, a.name from table a,
(select name,MAX(id)as id
from table
group by name) as b
where a.id=b.id
and a.name=b.name

只知道取最大或者最小id的复合查询

据说T—SQL中的OVER可以实现,具体怎么实现不清楚
  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-08-19 15:37 小黑

@周青
同意  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-08-19 16:03 小黑

看了上述评论,group by的用法在mysql和其它不一样。

对于group by在mysql中的使用和Oracle的差异性很大,准确的说不光和Oracle和别的数据库差异性一样,这些有点不太遵循标准SQL。我们知道常规的 sql,对于group by来说一定要结合聚合函数,而且选择的字段除了聚合函数外,还必须在group by中出现,否则报错,但是在mysql中扩展了这样的功能
首先对于不加聚合函数的sql来说,它的功能结合了limit来得出结果,仔细想想的时候有点Oracle分析函数的味道,limit的时候得到的并不是最大最小的值,而是某一下group by结果集中第一行,也就是刚才说的相当与先group by, 然后在每个group by下面进行limit 1。
其次,刚才还说了常规的group by结合聚合函数的时候,选择的字段除了聚合函数外,必须在group by中存在,但是在mysql中不是这样了,它具有隐含字段的功能。  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-09-18 10:11 蜗牛

谢谢周青
搞定了!mssql搞定了!  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2010-09-18 10:19 蜗牛

周青帅气!别人忽悠了一大通也没搞定。你就说了一句sql就搞定了!低调的高手啊!!  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2011-03-09 09:48 fenger

你那语句本来就是有问题的,能运行那是mysql的漏洞  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2011-05-12 14:52 YaLove

周青? 治标不治本~  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2011-11-08 14:57 77189

@qqq
group by 能用在没有聚合函数的sql语句中么??  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2013-06-28 14:51 wkyzk

楼主的结果不对吧,执行完后是不是应该是这样的:
name 个数
a 1
b 2
c 2
那语句应该是:
SELECT distinct name as name,COUNT(*) as 个数 FROM 表1.DBF GROUP BY name INTO TABLE 表2.dbf  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2013-11-01 11:52 rank

这种用法只能在MYSQL中用吗?
sqlserver中使用会提示错误,选择列表中的列 'table.id' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2013-11-19 20:23 joe

用表白查询
select * from(select distinct 字段名 from 表名) as 新表名  回复  更多评论   

# re: Select中DISTINCT关键字的用法?[未登录] 2013-11-19 20:23 joe

说错了,是表表查询  回复  更多评论   

# re: Select中DISTINCT关键字的用法? 2015-11-17 15:12 谢亚梅

我也觉得这个才是正确答案 群主发的是错误答案@wkyzk
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

公告

this year :
1 jQuery
2 freemarker
3 框架结构
4 口语英语

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

相册

EJB学习

Flex学习

learn English

oracle

spring MVC web service

SQL

Struts

生活保健

解析文件

搜索

最新评论

阅读排行榜

评论排行榜