2015-11-30 32 views
0

我在我的數據庫3個表內列出如下:從MySQL獲得統計數據使用聯合多個表和子查詢

Table:   teams_info 

team_id   team_name   entry_year   status 
    1     team 1     2015     1 
    2     team 2     2015     1 
    3     team 2     2016     1 

Table:   team_players 

player_id   team_id   status   members_id  position 
     1      1      0      1      1 
     2      1      1      2      2 
     3      1      1      3      3 
     4      1      1      4      4 
     5      2      0      5      1 
     6      2      0      6      2 
     7      2      1      7      3 

Table:   members 

members_id   first_name   surname   gender 
     1     joe     blogg     male 
     2     james    smith     male 
     3     sarah    marshall    female 
     4     tony     walker     male 
     5     peter    jones     male 
     6     jessica    varley     female 
     7     jane     varley     female 

我試圖讓我的頭圍繞如何將我得到以下信息,

1)有多少team_players從team_info.entry_year = 2015已經接受了加入一個團隊(這將是所有球員狀態= 1)

2)有多少team_players從team_info.entry_year = 2015已經邀請(基本上統計所有記錄長到2015年球隊team_info)

3)來自2015年球隊的總球隊球員。

4)來自2015年球隊的女子球員總數。

我對SQL相當陌生,看起來我已經使事情變得複雜,同時試圖遵循最好的標準,但是我無法將頭圍繞在哪裏開始。

+0

你的問題到底是什麼?我只能看到一個規範,但沒有任何問題。你還需要證明你已經做了什麼來解決這個問題。目前感覺您希望我們爲您解決功課。這些話題在這裏並不是很好。 – Shadow

回答

0

你使用的是mysql還是其他的RDBMS?

我會在這裏假設mysql,因爲可以使用各種連接語法,它們因數據庫而異。

你想在這裏做的是做一個所有3個表的INNER連接,這將給你一個交叉點的行。

幸運的是,你有一個很好的基本標準化結構,將TEAM實體從成員(玩家)中分離出來。

因爲你的應用支持「seasons」,所以你在team_players中有一個很好的多對多的解析表。

所以,加入表一起,嚴格來說,它並不真正的問題開始與表,但在這樣的情況下,我將與許多開始許多解析表: SELECT *

FROM team_players as tp LEFT JOIN teams_info as ti ON (ti.team_id = tp.team_id) LEFT JOIN members as m ON (m.members_id = tp.members_id) At this point, you are inner joining and should have 1 row essentially for every match, which is going to be one row for every row in team_players. 

在你的例子中,你需要一個計數,而不是SELECT ,你只需要COUNT()作爲'some_name'。你的別名取決於你。例如,您可以有:

SELECT count(*) as accepted_in_2015 
FROM team_players as tp 
LEFT JOIN teams_info as ti ON (ti.team_id = tp.team_id) 
LEFT JOIN members as m ON (m.members_id = tp.members_id) 

當然,現在缺少的是過濾。在大多數情況下,您可以使用WHERE子句添加它們,但我通常將它們添加到適當的連接條件中。所以當我添加一個與團隊有關的WHERE /過濾標準時,我會把它放在涉及teams_info連接的ON中。

它是一個「成員」表標準(第一個問題中的狀態)我在那裏添加。

所以要回答你的第一個問題,可能應該工作:

1)有多少team_players從team_info。entry_year = 2015 已經接受了加入一個團隊(這將是所有球員的狀態 = 1)

SELECT count(*) as accepted_in_2015 
FROM team_players as tp 
LEFT JOIN teams_info as ti ON (ti.team_id = tp.team_id AND ti.entry_year = 2015) 
LEFT JOIN members as m ON (m.members_id = tp.members_id AND m.status = 1) 

其他的問題都在這同一個藍圖所有變化和可確定的相同方式但是,在男性/女性的情況下,我可能只是在一個查詢中對男性和女性進行分組並計數。