2010-11-23 101 views
16

我有一個名爲GUYS(ID,NAME,PHONE)的表,我需要添加一個有多少人具有相同名稱並同時顯示所有人的計數,所以我不能將它們分組。 例如:沒有組計數

ID NAME PHONE 
1 John 335 
2 Harry 444 
3 James 367 
4 John 742 
5 John 654 

想要的輸出應該

ID NAME PHONE COUNT 
1 John 335 3 
2 Harry 444 1 
3 James 367 1 
4 John 742 3 
5 John 654 3 

我怎麼能做到這一點?我只設法得到很多不同的人。

感謝

回答

10

你仍然可以使用的計數GROUP BY,你只需要JOIN回你原來的表來獲取所有的記錄,像這樣:

select g.ID, g.Name, g.Phone, gc.Count 
from Guys g 
inner join (
    select Name, count(*) as Count 
    from Guys 
    group by Name 
) gc on g.Name = gc.Name 
21

由於MySQL的沒有按」沒有analytical functions like Oracle,你必須求助於子查詢。

不要使用GROUP BY,使用子選擇具有相同名稱的數人的數量:

SELECT 
    t.name, 
    t.phone, 
    (SELECT COUNT('x') FROM Guys ct 
    WHERE ct.name = t.name) as namecounter 
FROM 
    Guys t 

你會認爲運行一個子選擇的每一行都將是緩慢,但如果你有合適的索引,MySQL會優化這個查詢,你會發現它運行得很好。

在這個例子中,你應該有一個索引Guys.name。如果子查詢的where子句中有多個列,則查詢可能會受益於所有這些列上的單個組合索引。

+1

我預計這個查詢比redfilter的答案進行比較慢,但是這不是在我的測試情況。擁有一百萬行數據庫,它在不到一半的時間內完成。我有'名字'索引。 – Tony 2012-08-02 17:33:08

+0

不客氣。 :) – GolezTrol 2012-08-03 07:23:25

13

使用匯總查詢:

select g.ID, g.Name, g.Phone, count(*) over (partition by g.name) as Count 
from 
Guys g; 
0

Oracle數據庫中,你可以使用

SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;