一般来说,我正在尝试学习最佳的MySQL实践,在一个表中选择一组记录,其中的字段是另一个表中记录的子集。具体地说...
team_competition表存储团队注册的比赛:
团队比赛
630 AGLOA2017ELCE
630 AGLOA2017ELEQ
630 AGLOA2017ELPREZ
630 AGLOA2017ELPROP
...
player_competition表存储玩家注册的比赛:
球员比赛
186 AGLOA2017SREQ
186 AGLOA2017SRLING
186 AGLOA2017SROS
186 AGLOA2017SRPREZ
186 AGLOA2017SRPROP
186 AGLOA2017SRWFF
191 AGLOA2017SREQ
191 AGLOA2017SRLING
191 AGLOA2017SROS
191 AGLOA2017SRPREZ
191 AGLOA2017SRPROP
191 AGLOA2017SRWFF
...
要将球员分配给球队,我需要选择与相关球队注册参赛者的球员。对于本例中的团队630,我需要选择至少注册这四个比赛的球员:AGLOA2017ELCE,AGLOA2017ELEQ,AGLOA2017ELPREZ和AGLOA2017ELPROP。
数学上,我认为这相当于选择球队比赛的超集(包含)的球员比赛。我目前正在使用一个中等复杂的例程来循环玩家和比赛,并将每个比较与球队的比赛进行比较。它有效,但似乎非常低效。
我正在研究如何使用MySQL来选择'子集',但我遇到了一个心理障碍。当发生这种情况时,我通常可以通过写下我的问题来取得一些进展。只是打字这给了我一些想法,但现在已经写了......
...提前感谢您分享您可能拥有的任何解决方案。
答案 0 :(得分:0)
我不确定这是MySQL的最佳做法,但您可以通过比较团队的竞争计数与加入玩家的团队数量来实现此查询。
Select Team, Player
From (
Select Team, Player, count(0) matching
From team_competition t
Inner join player_competition p on t.Competition = p.Competition
Group by Team, Player
) tp
Inner join (
Select Team, count(0) competitions
From team_competitions
Group by Team
) t on tp.Team = t.Team
Where tp.matching = t.competitions
(在手机上写这个,原谅格式化)