在使用mysql時,有時須要查詢出某個字段不重複的記錄,雖然mysql提供 有distinct這個關鍵字來過濾掉多餘的重複記錄只保留一條,但每每只用它來返回不重複記錄的條數,而不是用它來返回不重記錄的全部值。其緣由是 distinct只能返回它的目標字段,而沒法返回其它字段,這個問題讓我困擾了好久,用distinct不能解決的話,我只有用二重循環查詢來解決,而 這樣對於一個數據量很是大的站來講,無疑是會直接影響到效率的。因此我花了不少時間來研究這個問題,網上也查不到解決方案mysql
下面先來看看例子:sql
table
id name
1 a
2 b
3 c
4 c
5 bapp
庫結構大概這樣,這只是一個簡單的例子,實際狀況會複雜得多。函數
好比我想用一條語句查詢獲得name不重複的全部數據,那就必須使用distinct去掉多餘的重複記錄。spa
select distinct name from table
獲得的結果是:設計
name
a
b
c開發
好像達到效果了,但是,我想要獲得的是id值呢?改一下查詢語句吧:it
select distinct name, id from tabletable
結果會是:class
id name
1 a
2 b
3 c
4 c
5 b
distinct怎麼沒起做用?做用是起了的,不過他同時做用了兩個字段,也就是必須得id與name都相同的纔會被排除。。。。。。。
咱們再改改查詢語句:
select id, distinct name from table
很遺憾,除了錯誤信息你什麼也得不到,distinct必須放在開頭。難到不能把distinct放到where條件裏?能,照樣報錯。。。。。。。
很麻煩吧?確實,費盡心思都沒能解決這個問題。
用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星期三, 09/21/2011 - 14:33 — jason
group by 用法解析
group by語法能夠根據給定數據列的每一個成員對查詢結果進行分組統計,最終獲得一個分組彙總表。
SELECT子句中的列名必須爲分組列或列函數。列函數對於GROUP BY子句定義的每一個組各返回一個結果。
某個員工信息表結構和數據以下:
id name dept salary edlevel hiredate
1 張三 開發部 2000 3 2009-10-11
2 李四 開發部 2500 3 2009-10-01
3 王五 設計部 2600 5 2010-10-02
4 王六 設計部 2300 4 2010-10-03
5 馬七 設計部 2100 4 2010-10-06
6 趙八 銷售部 3000 5 2010-10-05
7 錢九 銷售部 3100 7 2010-10-07
8 孫十 銷售部 3500 7 2010-10-06
例如,我想列出每一個部門最高薪水的結果,sql語句以下:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
查詢結果以下:
DEPT MAXIMUM
開發部 2500
設計部 2600
銷售部 3500
解釋一下這個結果:
一、知足「SELECT子句中的列名必須爲分組列或列函數」,由於SELECT有GROUP BY DEPT中包含的列DEPT。
二、「列函數對於GROUP BY子句定義的每一個組各返回一個結果」,根據部門分組,對每一個部門返回一個結果,就是每一個部門的最高薪水。
注意:計算的是每一個部門(由 GROUP BY 子句定義的組)而不是整個公司的 MAX(SALARY)。
例如,查詢每一個部門的總的薪水數
SELECT DEPT, sum( SALARY ) AS total
FROM STAFF
GROUP BY DEPT
查詢結果以下:
DEPT total
開發部 4500
設計部 7000
銷售部 9600
將 WHERE 子句與 GROUP BY 子句一塊兒使用
分組查詢能夠在造成組和計算列函數以前具備消除非限定行的標準 WHERE 子句。必須在GROUP BY 子句以前指定 WHERE 子句。
例如,查詢公司2010年入職的各個部門每一個級別裏的最高薪水
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
查詢結果以下:
DEPT EDLEVEL MAXIMUM
設計部 4 2300
設計部 5 2600
銷售部 5 3000
銷售部 7 3500
注意:在SELECT語句中指定的每一個列名也在GROUP BY子句中提到。未在這兩個地方提到的列名將產生錯誤。
GROUP BY子句對DEPT和EDLEVEL的每一個惟一組合各返回一行。
在GROUP BY子句以後使用HAVING子句可應用限定條件進行分組,以便系統僅對知足條件的組返回結果。爲此,在GROUP BY子句後面包含一個HAVING子句。HAVING子句可包含一個或多個用AND和OR鏈接的謂詞。每一個謂詞將組特性(如AVG(SALARY))與下列之一進行比較:例如:尋找僱員數超過2個的部門的最高和最低薪水:SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUMFROM staffGROUP BY DEPTHAVING COUNT( * ) >2ORDER BY DEPT查詢結果以下: DEPT MAXIMUM MINIMUM 設計部 2600 2100 銷售部 3500 3000例如:尋找僱員平均工資大於3000的部門的最高和最低薪水:SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUMFROM staffGROUP BY DEPTHAVING AVG( SALARY ) >3000ORDER BY DEPT查詢結果以下: DEPT MAXIMUM MINIMUM 銷售部 3500 3000