2

我有一个 MySQL 表,我在其中保持一对多的关系。该表用于存储足球统计程序的合作伙伴列表。一个玩家可以有 0、1 或 2 个伙伴。

例如:

___________________________________
| Table index | Partners | Players |
|      1      |     1    |  John   | - Singles, no partners
|      2      |     2    |  John   | - Doubles, John and Bob
|      3      |     2    |  Bob    | - Doubles, John and Bob
|      4      |     3    |  Dave   | - Roto doubles, Dave, Bob, John
|      5      |     3    |  Bob    | - Roto doubles, Dave, Bob, John
|      6      |     3    |  John   | - Roto doubles, Dave, Bob, John
|      7      |     4    |  Dave   | - Singles, no partners
____________________________________

我正在编写 PHP 脚本以从表中添加和检索合作伙伴,但我的查询遇到了问题。我了解玩家并想检索合作伙伴字段。我需要执行三个查询:

  • 检查没有合作伙伴 - 单身;
  • 检查特定的合作伙伴 - 与“戴夫”双打;
  • 检查两个特定的合作伙伴 - 与“鲍勃和戴夫”的双打;

如果该条目存在,我想检索它,如果不存在,那么我将该条目添加到表中。我遇到的麻烦之一是,例如,玩家“约翰”有三个条目,没有伙伴,一个伙伴,两个伙伴。如何指定仅拉出条目 1 而不是 2 或 6?

我在这里搜索并找到了几个接近但不完全符合我需要的示例。这一个mySQL: Querying one-to-many -table?几乎可以满足我的需要,但并不完全。

任何帮助将不胜感激。

克里斯

4

1 回答 1

0

如果我正确理解您的架构,您的 Partners 字段实际上是隐式分组表的外键(即最好将其命名为 TeamId 并将键放入一个名为 Team 的表中,其中每一行代表一个伙伴关系)。

让我们定义完整的模式,以便我们可以正常工作(这与您的表基本相同,但进行了非规范化以使其更清晰,您也可以只使用 PlayerId 而不是允许具有相同名称的不同玩家的名称)。您的多对多连接器表是 PlayerTeam。

在此处输入图像描述

我们可以通过运行此查询来获取给定玩家的 TeamId 和团队规模

SELECT TeamId, count(PlayerId) as TeamSize
FROM PlayerTeam
WHERE TeamId IN (SELECT TeamId FROM PlayerTeam WHERE PlayerId = *your-player-id*)
GROUP BY TeamId

您可以通过添加 HAVING 子句来获得特定规模的团队:

SELECT TeamId, count(PlayerId) as TeamSize
FROM PlayerTeam
WHERE TeamId IN (SELECT TeamId FROM PlayerTeam WHERE PlayerId = *your-player-id*)
GROUP BY TeamId
HAVING TeamSize = 2 

您还可以使用以下查询避免每个 Player 查询一次:

SELECT p.Name, p.PlayerId, pt.TeamId, sz.TeamSize
FROM Player p JOIN PlayerTeam pt USING(PlayerId)
   JOIN (SELECT TeamId, count(PlayerId) as TeamSize
         FROM PlayerTeam GROUP BY TeamId) AS sz USING(TeamId)

但是为了有效地使用最后一个,您需要使用结果来准备一个方便索引的关联数组(如$team[UserId][TeamSize] => TeamId)来做出决定。

于 2013-09-16T14:39:04.137 回答