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 閱讀(69630) 評論(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

          生活保健

          解析文件

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 万年县| 昭苏县| 惠来县| 牙克石市| 四平市| 堆龙德庆县| 乌海市| 巫溪县| 昆明市| 灵璧县| 利津县| 怀集县| 通山县| 嘉禾县| 晴隆县| 夏邑县| 崇州市| 新邵县| 江都市| 虹口区| 屯门区| 平凉市| 祁阳县| 柘荣县| 甘德县| 吉首市| 铜山县| 甘谷县| 大余县| 五家渠市| 湘潭县| 略阳县| 如皋市| 长宁县| 平泉县| 蚌埠市| 永修县| 湖州市| 梁山县| 台前县| 寻乌县|