SQL 多重连接不起作用

Tri*_*ham 2 php mysql sql

我有这个:

SELECT user_games.APPID, games_steam.name, games_xbox.name
FROM user_games
JOIN games_steam ON user_games.APPID = games_steam.APPID
JOIN games_xbox ON user_games.APPID = games_xbox.APPID
WHERE user_games.UID = "76561197996836099"
GROUP BY user_games.APPID
Run Code Online (Sandbox Code Playgroud)

但它不会返回任何内容,但是如果我删除任一连接及其相应的 SELECT,它们都可以正常工作。有谁知道这是为什么吗?

IMS*_*SoP 5

返回的行必须满足查询的所有条件

  • 如果只采用第一个 JOIN,您将获得APPID匹配的user_games所有行games_steam
  • 如果只采用第二个 JOIN,您将获得APPID匹配的user_games所有行games_xbox
  • 但是,如果您包含两个JOIN,您将仅获得与和 都APPID匹配的行。虽然可能存在这样的行,但是前两个查询中的行的存在决不能保证它。user_gamesgames_steam games_xbox

简单的解决方案是将两个JOINs 都转换为LEFT JOINs(严格来说,将INNER JOINs 转换为LEFT OUTER JOINs,但是INNEROUTER是可选关键字)。这会导致不会过滤掉任何行,但您的结果将包含以下内容:

  • 与和APPID均匹配的行,以及两个匹配项的详细信息games_steam games_xbox
  • APPID匹配的行,以及所有games_steam的详细信息games_xboxNULL
  • APPID匹配的行,以及所有games_xbox的详细信息games_steamNULL
  • 两个表都不APPID匹配的行,包含来自all的详细信息games_steam games_xboxNULL

当然,您可以使用适当的WHERE子句消除其中任何一种情况,例如WHERE ... AND (games_steam.APPID IS NOT NULL OR games_xbox.APPID IS NOT NULL)

但是,您可能还需要考虑这是否实际上是您希望组合结果的方式 - 即使用不同的联接添加列,而不是运行两个单独的查询并让它们添加行。