关于我的表格,我正在为我喜欢玩的一款游戏创建一个脚本,如果人们的账户分配了 XYZ 语句,我就会创建一个脚本。它基于 4 个表。1 个表保存了带有比赛 ID 的过往比赛,下一个表保存了比赛 ID 与玩家 ID 的关系,表 3 保存了玩家 ID 与游戏内 ID 的关系,而最后一个表保存了有关分配给他们的声明的信息。
一场比赛中可能有多达 15 名球员,因此需要关系表,有些球员在不同的比赛中出现不止一次。
因此这些关系表如下所示:games(比赛 ID)-> match to player(比赛 ID 到球员 ID)-> players(球员 ID 到游戏内 ID)-> player Info(游戏内 ID ->查询所需的信息)
因此,当脚本被查询时,我将比赛所有者 UID 与比赛数据一起保存在包含比赛信息的第一个表中,它将根据所有者 ID 返回所有比赛 ID,因此,所有比赛 ID 将检查下一个表,以获得所有唯一的玩家 ID,根据该列表,然后查询下一个表,以获得所有这些游戏内 ID 的列表,根据该列表,然后查询最后一个表,以获得每个玩家的游戏内分配。
我无法改变表格的方式,因为所有其他脚本都依赖于这些表格。
我已经尝试了一些连接语句,但没有一个语句能达到我的要求,甚至没有一个语句能达到我要求的一半,但我确实认为连接语句的使用将使我达到我所需要的目标。
我正试图根据第一个表中的 ID 从图片上的最后一个表中获取一个列表。我知道我需要使用连接,但是我不确定连接的顺序,我需要一些指导来说明如何组织连接以获得我需要的数据。
SELECT b.*
FROM banInfo AS b
JOIN players AS p ON b.game_id=p.game_id
JOIN player2match AS pm ON pm.pid=p.id
JOIN matches AS m ON m.id=pm.mid
JOIN users AS u ON u.id=m.uid
WHERE u.id = 1 AND b.comBan = 1 OR b.playerBan > 0 OR b.nGameBan > 0
这是我目前使用的查询,它是半工作的,因为它确实返回了所需信息的列表,但比应该返回的要多得多,所以不知何故它选择了一些不应该选择的信息,问题是我不知道它总共应该返回多少信息,这是我需要查询的内容之一,以便获得信息的总数。但我知道它返回的数据太多了,因为数据库中总共有 1355 名被禁赛的球员,但该查询却返回了 2254 行,所以不知为何选择的数据比它应该选择的要多。
谢谢!
你的查询返回过多的行的原因可能是因为你使用了 OR
来组合了 WHERE
子句中的条件。 尝试使用 IN
操作符和一个子查询来代替多个连接,这将使你的查询更有效率,并确保你只检索与所有者 ID 为 1 的比赛相关的玩家信息。
试试这个查询:
SELECT DISTINCT b.*
FROM banInfo AS b
WHERE b.game_id IN (
SELECT p.game_id
FROM players AS p
JOIN player2match AS pm ON pm.pid = p.id
JOIN matches AS m ON m.id = pm.mid
WHERE m.uid = 1
)
AND (b.comBan = 1 OR b.playerBan > 0 OR b.nGameBan > 0);
这个查询的工作原理如下:
- 子查询:
- 它首先从
matches
表中选择uid
为 1 的所有比赛。 - 然后使用
player2match
表将这些比赛与相应的玩家 ID 连接起来。 -
最后,它使用
players
表检索与这些玩家 ID 相关的game_id
。 -
主查询:
- 它从
banInfo
表中选择记录,其中game_id
存在于子查询返回的game_id
列表中。 - 它还使用
WHERE
子句来过滤结果,只包括满足以下任一条件的记录:comBan = 1
或playerBan > 0
或nGameBan > 0
。 DISTINCT
关键字用于确保结果集中只返回唯一的记录,从而防止由于多个表中的关系而可能出现的任何重复。
通过使用这种方法,你避免了多个连接,并简化了查询逻辑,使其更容易理解和维护。 这也应该会提高查询的性能,特别是对于大型数据集。
标签:sql,mysql,join From: 78546892