使用 JOINED 多个表和子查询从 MySql 获取统计信息

Getting statistics from MySql using JOINED multiple tables and sub queries

我的数据库中有三个 table,如下所列:

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_info.entry_year = 2015 年有多少 team_players 接受了加入一个团队(这将是状态 = 1 的所有玩家)

2) team_info.entry_year = 2015年有多少team_players被邀请了(基本上统计了table team_info中属于2015年球队的所有记录)

3) 2015 年球队的男性球员总数。

4) 2015支球队女队员总数

我是 SQL 的新手,似乎我在尝试遵循最佳标准的同时让事情变得复杂,但是我不知道从哪里开始。

您使用的是 mysql 还是其他 RDBMS?

我在这里假定 mysql,因为您可以使用多种连接语法,并且它们因数据库而异。

你想在这里做的是对所有 3 个 table 进行 INNER 连接,这将为你每个交叉点一行。

幸运的是,您有一个良好的基本规范化结构,将 TEAM 实体与 MEMBERS(球员)分开。

因为您的应用支持 "seasons",所以您在 team_players.

中有一个很好的多对多解析器 table

所以,要将 table 连接在一起,严格来说,从哪个 table 开始并不重要,但在这种情况下,我将从许多开始许多分辨率 table: 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.

在您的示例中,您需要一个计数,因此您只需要 COUNT() 作为 'some_name' 而不是 SELECT 。您给该名称起什么别名取决于您。例如你可以有:

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/filtration 条件时,我会将其放在涉及 teams_info 加入的 ON 中。

哪里是 'member' table 标准(第一个问题中的状态)我在那里添加。

因此,为了回答您的第一个问题,这应该可行:

1) How many team_players from team_info.entry_year = 2015 have accepted the to join a team (this will be all players with status = 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)

其他问题都是同一个蓝图的变体,可以用相同的方式确定,但是,在 male/female 的情况下,我可能只是分组并计算男性与女性的数量在一个查询中。