Select中DISTINCT關(guān)鍵字的用法?

          在使用mysql時(shí),有時(shí)需要查詢出某個(gè)字段不重復(fù)的記錄,雖然mysql提供有distinct這個(gè)關(guān)鍵字來過濾掉多余的重復(fù)記錄只保留一條,但往往只用它來返回不重復(fù)記錄的條數(shù),而不是用它來返回不重記錄的所有值。其原因是distinct只能返回它的目標(biāo)字段,而無法返回其它字段,這個(gè)問題讓我困擾了很久,用distinct不能解決的話,我只有用二重循環(huán)查詢來解決,而這樣對(duì)于一個(gè)數(shù)據(jù)量非常大的站來說,無疑是會(huì)直接影響到效率的。所以我花了很多時(shí)間來研究這個(gè)問題,網(wǎng)上也查不到解決方案,期間把容容拉來幫忙,結(jié)果是我們兩人都郁悶了。。。。。。。。。

          下面先來看看例子:

              table
            id name
            1 a
            2 b
            3 c
            4 c
            5 b

          庫結(jié)構(gòu)大概這樣,這只是一個(gè)簡(jiǎn)單的例子,實(shí)際情況會(huì)復(fù)雜得多。

          比如我想用一條語句查詢得到name不重復(fù)的所有數(shù)據(jù),那就必須使用distinct去掉多余的重復(fù)記錄。

          select distinct name from table
          得到的結(jié)果是:

            name
            a
            b
            c

          好像達(dá)到效果了,可是,我想要得到的是id值呢?改一下查詢語句吧:

          select distinct name, id from table

          結(jié)果會(huì)是:

            id name
            1 a
            2 b
            3 c
            4 c
            5 b

          distinct怎么沒起作用?作用是起了的,不過他同時(shí)作用了兩個(gè)字段,也就是必須得id與name都相同的才會(huì)被排除。。。。。。。

          我們?cè)俑母牟樵冋Z句:

          select id, distinct name from table

          很遺憾,除了錯(cuò)誤信息你什么也得不到,distinct必須放在開頭。難到不能把distinct放到where條件里?能,照樣報(bào)錯(cuò)。。。。。。。

          很麻煩吧?確實(shí),費(fèi)盡心思都沒能解決這個(gè)問題。沒辦法,繼續(xù)找人問。

          拉住公司里一JAVA程序員,他給我演示了oracle里使用distinct之后,也沒找到mysql里的解決方案,最后下班之前他建議我試試group by。

          試了半天,也不行,最后在mysql手冊(cè)里找到一個(gè)用法,用group_concat(distinct name)配合group by name實(shí)現(xiàn)了我所需要的功能,興奮,天佑我也,趕快試試。

          報(bào)錯(cuò)。。。。。。。。。。。。郁悶。。。。。。。連mysql手冊(cè)也跟我過不去,先給了我希望,然后又把我推向失望,好狠哪。。。。

          再仔細(xì)一查,group_concat函數(shù)是4.1支持,暈,我4.0的。沒辦法,升級(jí),升完級(jí)一試,成功。。。。。。

          終于搞定了,不過這樣一來,又必須要求客戶也升級(jí)了。

          突然靈機(jī)一閃,既然可以使用group_concat函數(shù),那其它函數(shù)能行嗎?

          趕緊用count函數(shù)一試,成功,我。。。。。。。想哭啊,費(fèi)了這么多工夫。。。。。。。。原來就這么簡(jiǎn)單。。。。。。

          現(xiàn)在將完整語句放出:

          select *, count(distinct name) from table group by name

          結(jié)果:

            id name count(distinct name)
            1 a 1
            2 b 1
            3 c 1

          最后一項(xiàng)是多余的,不用管就行了,目的達(dá)到。。。。。

          唉,原來mysql這么笨,輕輕一下就把他騙過去了,郁悶也就我吧(對(duì)了,還有容容那家伙),現(xiàn)在拿出來希望大家不要被這問題折騰。

          哦,對(duì),再順便說一句,group by 必須放在 order by 和 limit之前,不然會(huì)報(bào)錯(cuò),差不多了,發(fā)給容容放網(wǎng)站上去,我繼續(xù)忙碌。。。。。。

          posted on 2007-04-17 11:17 youngturk 閱讀(69630) 評(píng)論(36)  編輯  收藏 所屬分類: Oracle

          評(píng)論

          # re: Select中DISTINCT關(guān)鍵字的用法? 2007-10-23 16:08 喬喬

          你好,
          我用的是ACCESS做為數(shù)據(jù)庫,同樣是數(shù)據(jù)庫里有重復(fù)的信息,查詢時(shí)想同一公司的信息只顯示一條,但是我想得到的是公司的整體情況,
          connsousuoSQL="SELECT *, count(distinct G_webname) FROM G_user Where G_webname like '%"&txtitle&"%' group by G_webname"

          用了你的方法(如上語句)后還是出錯(cuò),

          麻煩你指點(diǎn)一下

          謝謝  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2007-10-23 16:17 喬喬

          你好,
          我用的是ACCESS做為數(shù)據(jù)庫,同樣是數(shù)據(jù)庫里有重復(fù)的信息,查詢時(shí)想同一公司的信息只顯示一條,但是我想得到的是公司的整體情況,
          connsousuoSQL="SELECT *, count(distinct G_webname) FROM G_user Where G_webname like '%"&txtitle&"%' group by G_webname"

          用了你的方法(如上語句)上傳到網(wǎng)上,網(wǎng)站搜索后還是出錯(cuò),

          麻煩你指點(diǎn)一下

          謝謝  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2008-01-05 13:47 nothing

          你這樣選擇出來的數(shù)據(jù)本身邏輯就有問題,對(duì)于c,它對(duì)應(yīng)的ID有好幾個(gè),你希望選擇出來的是哪個(gè)ID呢?在嚴(yán)格應(yīng)用時(shí),這種選擇邏輯就有錯(cuò)誤  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 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";  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2008-05-19 16:55 詳詳細(xì)細(xì)

          select *, count(distinct name) from table group by name
          這樣也行? group by 能這么用?  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2008-05-27 15:44 chinetman

          select distinct(列名) from 表名 order by 列名  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2008-07-09 10:42

          不行!  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2008-07-18 19:05 sk.lee

          我想知道具體表的信息能知道麼,進(jìn)來忙沒常來光顧..  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2008-08-29 22:53 heyse

          使用group by和聚合函數(shù)
          select name,MAX(ID) AS ID from tName group by name
          go
            回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2009-03-02 09:57 w~~

          select distinct 1,2 from table group by 1;
          同樣是在table中查詢不同的1的1,2字段,也能實(shí)現(xiàn)需要的功能  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2009-08-19 13:58 qqq

          不錯(cuò)的笑話題材
          當(dāng)回好人吧
          select *, count(distinct name) from table group by name
          這條SQL有脫褲子放屁的感覺,要是想得要樓主說的結(jié)果可以直接這么寫
          select * from table group by name
          與distinct有啥關(guān)系?
          大家最好先了解一下group by的功能 樓主現(xiàn)在應(yīng)該成長(zhǎng)了,也不來改正這愚蠢的錯(cuò)誤。  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2009-09-04 11:38 jun

          不錯(cuò),我也是遇到這樣的問題,謝謝你給我找到了你的辦法。
          真的可以騙得過去哦!^.^  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2009-09-13 11:10 aaa

          select * from table group by name  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2009-09-13 11:11 aaa

          不好意思,貌似ls某位兄弟已經(jīng)說了,沒認(rèn)真看評(píng)論=。。=  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2009-10-14 16:53 lzp

          真無語
          用這么麻煩嗎樓主???
          select * from table group by name;
          直接搞定.  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2009-12-12 22:11 4321

          group by name了還可以select * ???????  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2010-04-01 14:03 不會(huì)游泳的魚

          @qqq
          不懂的不要亂評(píng)論,免得誤導(dǎo)別人....真無語,評(píng)論之前自己也不知道試下.還陣陣有詞  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2010-04-01 18:37 melon

          select * from table group by name having count(distinct(name))=1  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2010-04-10 16:59 luo

          group by name 對(duì)應(yīng) select * ? 語法太高級(jí)了吧  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2010-04-11 10:46 游客

          操你媽的一群不負(fù)責(zé)、水平差、不懂裝懂的垃圾,對(duì)技術(shù)性文章發(fā)表評(píng)論的時(shí)候負(fù)責(zé)點(diǎn)好嗎?浪費(fèi)老子時(shí)間。
            回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2010-04-22 10:16 周青

          select name,id from table where id in
          (select min(id) from table group by name)  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2010-07-18 08:57 不懂

          試了又試,還是不行,  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2010-07-18 09:05 不懂

          有兩個(gè)意義上的重復(fù)記錄,一是完全重復(fù)的記錄,也即所有字段均重復(fù)的記錄,二是部分關(guān)鍵字段重復(fù)的記錄,比如Name字段重復(fù),而其他字段不一定重復(fù)或都重復(fù)可以忽略。

          1、對(duì)于第一種重復(fù),比較容易解決,使用

            select distinct * from tableName

            就可以得到無重復(fù)記錄的結(jié)果集。

            如果該表需要?jiǎng)h除重復(fù)的記錄(重復(fù)記錄保留1條),可以按以下方法刪除

            select distinct * into #Tmp from tableName

            truncate table tableName

            select * into tableName from #Tmp

            drop table #Tmp

            發(fā)生這種重復(fù)的原因是表設(shè)計(jì)不周產(chǎn)生的,增加唯一索引列即可解決。

            2、這類重復(fù)問題通常要求保留重復(fù)記錄中的第一條記錄,操作方法如下

            假設(shè)有重復(fù)的字段為Name,Address,要求得到這兩個(gè)字段唯一的結(jié)果集

            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)

            最后一個(gè)select即得到了Name,Address不重復(fù)的結(jié)果集(但多了一個(gè)autoID字段,實(shí)際寫時(shí)可以寫在select子句中省去此列)  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 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的復(fù)合查詢

          據(jù)說T—SQL中的OVER可以實(shí)現(xiàn),具體怎么實(shí)現(xiàn)不清楚
            回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2010-08-19 15:37 小黑

          @周青
          同意  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2010-08-19 16:03 小黑

          看了上述評(píng)論,group by的用法在mysql和其它不一樣。

          對(duì)于group by在mysql中的使用和Oracle的差異性很大,準(zhǔn)確的說不光和Oracle和別的數(shù)據(jù)庫差異性一樣,這些有點(diǎn)不太遵循標(biāo)準(zhǔn)SQL。我們知道常規(guī)的 sql,對(duì)于group by來說一定要結(jié)合聚合函數(shù),而且選擇的字段除了聚合函數(shù)外,還必須在group by中出現(xiàn),否則報(bào)錯(cuò),但是在mysql中擴(kuò)展了這樣的功能
          首先對(duì)于不加聚合函數(shù)的sql來說,它的功能結(jié)合了limit來得出結(jié)果,仔細(xì)想想的時(shí)候有點(diǎn)Oracle分析函數(shù)的味道,limit的時(shí)候得到的并不是最大最小的值,而是某一下group by結(jié)果集中第一行,也就是剛才說的相當(dāng)與先group by, 然后在每個(gè)group by下面進(jìn)行l(wèi)imit 1。
          其次,剛才還說了常規(guī)的group by結(jié)合聚合函數(shù)的時(shí)候,選擇的字段除了聚合函數(shù)外,必須在group by中存在,但是在mysql中不是這樣了,它具有隱含字段的功能。  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2010-09-18 10:11 蝸牛

          謝謝周青
          搞定了!mssql搞定了!  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2010-09-18 10:19 蝸牛

          周青帥氣!別人忽悠了一大通也沒搞定。你就說了一句sql就搞定了!低調(diào)的高手啊!!  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2011-03-09 09:48 fenger

          你那語句本來就是有問題的,能運(yùn)行那是mysql的漏洞  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2011-05-12 14:52 YaLove

          周青? 治標(biāo)不治本~  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2011-11-08 14:57 77189

          @qqq
          group by 能用在沒有聚合函數(shù)的sql語句中么??  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2013-06-28 14:51 wkyzk

          樓主的結(jié)果不對(duì)吧,執(zhí)行完后是不是應(yīng)該是這樣的:
          name 個(gè)數(shù)
          a 1
          b 2
          c 2
          那語句應(yīng)該是:
          SELECT distinct name as name,COUNT(*) as 個(gè)數(shù) FROM 表1.DBF GROUP BY name INTO TABLE 表2.dbf  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2013-11-01 11:52 rank

          這種用法只能在MYSQL中用嗎?
          sqlserver中使用會(huì)提示錯(cuò)誤,選擇列表中的列 'table.id' 無效,因?yàn)樵摿袥]有包含在聚合函數(shù)或 GROUP BY 子句中。  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2013-11-19 20:23 joe

          用表白查詢
          select * from(select distinct 字段名 from 表名) as 新表名  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法?[未登錄] 2013-11-19 20:23 joe

          說錯(cuò)了,是表表查詢  回復(fù)  更多評(píng)論   

          # re: Select中DISTINCT關(guān)鍵字的用法? 2015-11-17 15:12 謝亞梅

          我也覺得這個(gè)才是正確答案 群主發(fā)的是錯(cuò)誤答案@wkyzk
            回復(fù)  更多評(píng)論   

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          this year :
          1 jQuery
          2 freemarker
          3 框架結(jié)構(gòu)
          4 口語英語

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          EJB學(xué)習(xí)

          Flex學(xué)習(xí)

          learn English

          oracle

          spring MVC web service

          SQL

          Struts

          生活保健

          解析文件

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 梅州市| 江门市| 韶山市| 清原| 寻乌县| 西平县| 井陉县| 齐河县| 读书| 温州市| 湟源县| 盘山县| 安福县| 紫阳县| 三原县| 镇原县| 红桥区| 集贤县| 黔南| 宣化县| 略阳县| 扎囊县| 英山县| 固镇县| 奇台县| 彭州市| 寿宁县| 瑞昌市| 高雄市| 钦州市| 梅河口市| 德令哈市| 来凤县| 新宾| 凤阳县| 桃源县| 盘锦市| 繁昌县| 峡江县| 靖安县| 潢川县|