2015-11-30 28 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) 

其他的问题都在这同一个蓝图所有变化和可确定的相同方式但是,在男性/女性的情况下,我可能只是在一个查询中对男性和女性进行分组并计数。