<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    下面先來看看例子:

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

    庫結(jié)構(gòu)大概這樣,這只是一個簡單的例子,實際情況會復雜得多。

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

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

      name
      a
      b
      c

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

    select distinct name, id from table

    結(jié)果會是:

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

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

    我們再改改查詢語句:

    select id, distinct name from table

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

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

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

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

    報錯。。。。。。。。。。。。郁悶。。。。。。。連mysql手冊也跟我過不去,先給了我希望,然后又把我推向失望,好狠哪。。。。

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

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

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

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

    現(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

    最后一項是多余的,不用管就行了,目的達到。。。。。

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

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

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

    評論

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

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

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

    麻煩你指點一下

    謝謝  回復  更多評論   

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

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

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

    麻煩你指點一下

    謝謝  回復  更多評論   

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

    你這樣選擇出來的數(shù)據(jù)本身邏輯就有問題,對于c,它對應的ID有好幾個,你希望選擇出來的是哪個ID呢?在嚴格應用時,這種選擇邏輯就有錯誤  回復  更多評論   

    # 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";  回復  更多評論   

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

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

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

    select distinct(列名) from 表名 order by 列名  回復  更多評論   

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

    不行!  回復  更多評論   

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

    我想知道具體表的信息能知道麼,進來忙沒常來光顧..  回復  更多評論   

    # 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
      回復  更多評論   

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

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

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

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

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

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

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

    select * from table group by name  回復  更多評論   

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

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

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

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

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

    group by name了還可以select * ???????  回復  更多評論   

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

    @qqq
    不懂的不要亂評論,免得誤導別人....真無語,評論之前自己也不知道試下.還陣陣有詞  回復  更多評論   

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

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

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

    group by name 對應 select * ? 語法太高級了吧  回復  更多評論   

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

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

    # 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)  回復  更多評論   

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

    試了又試,還是不行,  回復  更多評論   

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

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

    1、對于第一種重復,比較容易解決,使用

      select distinct * from tableName

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

      如果該表需要刪除重復的記錄(重復記錄保留1條),可以按以下方法刪除

      select distinct * into #Tmp from tableName

      truncate table tableName

      select * into tableName from #Tmp

      drop table #Tmp

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

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

      假設有重復的字段為Name,Address,要求得到這兩個字段唯一的結(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)

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

    # 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的復合查詢

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

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

    @周青
    同意  回復  更多評論   

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

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

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

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

    謝謝周青
    搞定了!mssql搞定了!  回復  更多評論   

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

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

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

    你那語句本來就是有問題的,能運行那是mysql的漏洞  回復  更多評論   

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

    周青? 治標不治本~  回復  更多評論   

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

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

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

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

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

    這種用法只能在MYSQL中用嗎?
    sqlserver中使用會提示錯誤,選擇列表中的列 'table.id' 無效,因為該列沒有包含在聚合函數(shù)或 GROUP BY 子句中。  回復  更多評論   

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

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

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

    說錯了,是表表查詢  回復  更多評論   

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

    我也覺得這個才是正確答案 群主發(fā)的是錯誤答案@wkyzk
      回復  更多評論   

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

    導航

    統(tǒng)計

    公告

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

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    EJB學習

    Flex學習

    learn English

    oracle

    spring MVC web service

    SQL

    Struts

    生活保健

    解析文件

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费人妻无码不卡中文字幕18禁| 黄瓜视频高清在线看免费下载| 亚洲高清成人一区二区三区| 亚洲乱色伦图片区小说| 色婷婷7777免费视频在线观看| 亚洲视频一区二区三区| 最近免费2019中文字幕大全| 亚洲高清在线mv| 国产精品永久免费10000| 亚洲国产精品张柏芝在线观看| 亚洲美女视频免费| 33333在线亚洲| 日韩成人免费在线| 精品一区二区三区免费毛片| 亚洲电影日韩精品| 青青操免费在线视频| 亚洲2022国产成人精品无码区| 七色永久性tv网站免费看| 亚洲视频.com| 国产无人区码卡二卡三卡免费| 亚洲 日韩经典 中文字幕| 日本免费一二区在线电影| 污污污视频在线免费观看| 亚洲国产精品一区二区成人片国内| 日韩免费的视频在线观看香蕉| 亚洲精品影院久久久久久| 无码中文字幕av免费放| 国产产在线精品亚洲AAVV| 亚洲中文字幕无码一久久区| 色猫咪免费人成网站在线观看 | 精品亚洲AV无码一区二区| 成年女人毛片免费视频| 日韩在线视频免费| 亚洲国产天堂在线观看| 最近免费中文字幕4| 国产精品免费在线播放| 亚洲欧洲日产韩国在线| 免费观看四虎精品国产永久| 人人揉揉香蕉大免费不卡| 亚洲精品中文字幕无乱码麻豆| 亚洲AV无码之日韩精品|