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

    <2015年11月>
    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)論排行榜

    主站蜘蛛池模板: 国产精品亚洲精品久久精品| 91成人在线免费观看| 亚洲影院在线观看| 国产裸模视频免费区无码| 免费黄色电影在线观看| 国产精品亚洲一区二区三区久久 | 久久精品国产亚洲Aⅴ香蕉| 97热久久免费频精品99| WWW免费视频在线观看播放| 亚洲a∨无码精品色午夜| 亚洲婷婷综合色高清在线| 国产精一品亚洲二区在线播放| 国产免费看插插插视频| 97人伦色伦成人免费视频| 91麻豆国产免费观看| 18女人腿打开无遮掩免费| 久久国产免费观看精品| 精品国产污污免费网站| 2019中文字幕在线电影免费| 男女免费观看在线爽爽爽视频| 久久久久高潮毛片免费全部播放| 97国产在线公开免费观看| 中字幕视频在线永久在线观看免费| 久久午夜羞羞影院免费观看| 三年片免费观看大全国语| 一本岛v免费不卡一二三区| 亚洲av乱码中文一区二区三区| 国内成人精品亚洲日本语音| a高清免费毛片久久| 成人午夜免费视频| 国产精品亚洲一区二区三区| 一级全免费视频播放| 午夜无码A级毛片免费视频| 久久久精品免费国产四虎| 麻豆视频免费播放| 亚洲一区二区三区免费观看| 男男AV纯肉无码免费播放无码| 国产成人在线观看免费网站 | 国产亚洲欧洲精品| 亚洲国产av美女网站| 亚洲一区免费视频|