gpt4 book ai didi

php - 一对多搜索查询

转载 作者:行者123 更新时间:2023-11-29 03:37:50 25 4
gpt4 key购买 nike

我有一个 MySQL 表,我在其中保持一对多关系。该表用于存储 table 上足球统计程序的合作伙伴列表。一个玩家可以有 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 脚本以从表中添加和检索合作伙伴,但我在查询时遇到了问题。我认识玩家并想检索合作伙伴字段。我需要执行三个查询:

  • 检查是否没有伴侣 - 单例;
  • 检查特定合作伙伴 - 与“Dave” double ;
  • 检查两个特定的合作伙伴 - 与“Bob 和 Dave”的 double ;

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

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

如有任何帮助,我们将不胜感激。

克里斯

最佳答案

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

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

enter image description here

我们可以通过运行此查询来获取给定玩家的 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

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

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)来制作决定。

关于php - 一对多搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18829308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com