gpt4 book ai didi

mysql - 使用正确的 MYSQL JOIN

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

我正在尝试从匹配表中获取所有数据,以及当前注册的每种类型的玩家,无论是否有经验。

游戏玩家

(PK)Gamer_Id
Gamer_firstName,
Gamer_lastName,
Gamer experience(Y/N)

Gamer_matches

(PK)FK GamerId,
(PK)FK MatchId,
Gamer_score

匹配

(PK)Match_Id,
ExperiencedGamers_needed,
InExperiencedGamers_needed

我已经尝试过此查询以及许多其他查询,但它不起作用,这是一个错误的连接吗?

SELECT M.MatchId,M.ExperiencedGamers_needed,M.InExperiencedGamers_needed,
(SELECT COUNT(GM.GamerId)
FROM Gamers G, Gamers_matches GM
WHERE G.GamerId = GM.GamerId
AND G.experience = "Y"
AND GM.MatchId = M.MatchId
GROUP BY GM.MatchId)AS ExpertsSignedUp,

(SELECT COUNT(GM.GamerId)
FROM Gamers G, Gamers_matches GM
WHERE G.GamerId = GM.GamerId
AND G.experience = "N"
AND GM.MatchId = M.MatchId
GROUP BY GM.MatchId) AS NovicesSignedUp

FROM MATCHES M

最佳答案

您所写的称为相关子查询,它强制 SQL 为从 Matches 中获取的每一行重新执行子查询。它可以工作,但效率很低。在一些复杂的查询中,它可能是必要的,但在这种情况下不是。

我会这样解决这个问题:

SELECT M.MatchId, M.ExperiencedGamers_needed,M.InExperiencedGamers_needed,
SUM(G.experience = 'Y') AS ExpertsSignedUp,
SUM(G.experience = 'N') AS NovicesSignedUp
FROM MATCHES M
LEFT OUTER JOIN (Gamer_matches GM
INNER JOIN Gamers G ON G.GamerId = GM.GamerId)
ON M.MatchId = GM.MatchId
GROUP BY M.MatchId;

由于末尾的 GROUP BY,这里每个匹配只输出一行。

没有子查询可以重复执行多次,它只是将 Matches 连接到其他表中的相应行一次。但是我使用外部连接以防一场比赛中两种类型的玩家都为零。

然后,我没有使用 COUNT(),而是使用了 MySQL 的技巧,并在 SUM() 函数内使用了带有 bool 表达式的 SUM()。 MySQL 中的 bool 表达式始终返回 0 或 1。这些 SUM() 与表达式返回 true 的 COUNT() 相同。这样我就可以得到专家和新手都只扫描一次 Gamers 表的“计数”。


附言MySQL 以非标准方式从 bool 表达式返回 0 或 1。标准 ANSI SQL 不支持这一点,许多其他品牌的 RDBMS 也不支持。标准地, bool 表达式返回一个 bool 值,而不是一个整数。

但如果您需要编写标准 SQL 以实现可移植性,则可以使用更详细的表达式:

SUM(CASE G.experience WHEN 'Y' THEN 1 WHEN 'N' THEN 0 END) AS ExpertsSignedUp

关于mysql - 使用正确的 MYSQL JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15746717/

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