使用 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 的情况下,我可能只是分组并计算男性与女性的数量在一个查询中。
我的数据库中有三个 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 的情况下,我可能只是分组并计算男性与女性的数量在一个查询中。