2014-03-31 70 views
0

我需要一些幫助。我堅持這個SQL查詢。SQL - 團隊和他們的球員人數

我有2個表團隊和功能。團隊包含ID,Teamname。功能包含ID,Role

角色決定一個人是球員還是教練(0代表球員,1代表教練)。

我應該列出所有存在的球隊,但他們應該只計算球員,甚至沒有球員的球隊應該被列入。例如,有些球隊只有教練。

我找不到任何方法來統計團隊內的每個人。

這是我來最接近:

select teamname, 
     count(*) 
from function left outer join team on team.id = function.id 
WHERE role=0 
group by teamname; 
+0

@OP,在我的回答如下查詢是相同的你的,它似乎工作正常。你是否想要得到類似於|的結果? TEAMNAME |玩家數量|或不同的東西? –

+0

是的,我應該得到這樣的輸出。或 |#的球員|隊伍名稱| – user3482887

+0

運行查詢時返回什麼? –

回答

1

這裏有一種方法來獲得結果:

SELECT t.teamname 
    , COUNT(1) AS player_count 
    FROM team t 
    LEFT 
    JOIN function f 
    ON f.id = t.id 
    AND f.role = 0 
GROUP BY t.teamname; 

- 或 -

SELECT t.teamname 
    , IFNULL(SUM(f.role=0),0) AS player_count 
    FROM team t 
    LEFT 
    JOIN function f 
    ON f.id = t.id 
GROUP BY t.teamname; 

這些查詢使用team表作爲驅動程序,所以我們從team得到行即使在函數中沒有匹配的行。在第一個查詢中,我們將role = 0條件包含爲連接謂詞,但它是一個外連接。在第二個查詢中,它仍然是一個外連接,但我們只對具有role = 0的行進行「計數」。

注意它看起來好像你的模型中缺少某些東西;連接謂詞id=id看起來很奇怪;奇怪的是我們在函數表中有一個名爲id的列,該列是一個引用team.id的外鍵。

通常,id是表中的替代主鍵,它在該表中是唯一的。如果它是在function表獨特的,那麼意味着teamfunction之間一比一的關係,並且查詢永遠不會返回一個大於1

數同樣,我強烈懷疑「成員」實體在模型中缺失。

我們期望是什麼東西這樣的:

team 
    id   PK 
    teamname 

member 
    id   PK 
    team_id FK references team.id 
    role  0=player, 1=coach 

使得查詢會是這個樣子:

SELECT t.teamname 
    , IFNULL(SUM(m.role=0),0) AS player_count 
    , IFNULL(SUM(m.role=1),0) AS coach_count 
    FROM team t 
    LEFT 
    JOIN member m 
    ON m.team_id = t.id 
+0

還有第三張桌子,會員。它確實conatin ID,姓名,家庭姓名和出生。 – user3482887

+0

謝謝!它的工作原理非常好,更要感謝解釋它是如何工作的,所以我可以理解! – user3482887

0

SELECT子句中存在的聚合函數您不能選擇一列。

要獲得表中所有行的計數並獲得團隊名稱,您必須僅使用SELECT子句中的聚合列或函數。例如:

SELECT COUNT(*), team.teamname 
FROM function LEFT OUTER JOIN team ON team.id = function.id 
WHERE function.role = 0 
GROUP BY team.teamname 

給你一個總的所有行的其中role等於0 加上球隊的名稱。

+0

這不回答問題。這隻會顯示數據庫中有多少玩家,不會說明他們在哪個隊伍中。 – paqogomez

+0

@paqogomez - 謝謝我已經更新了我的答案。編輯:剛纔意識到這是OP的問題一樣。這對我有用,所以我不確定OP發生了什麼。 –

0

使用以下代替:

SELECT teamname,SUM(IF(role=0,1,0)) players 
FROM function 
LEFT JOIN team USING (id) 
GROUP BY teamname; 

這從有玩家角色 '功能' 只統計那些條目(0)。

相關問題