SQL连接查询使用三个表和一些空值

时间:2013-04-17 16:39:56

标签: php mysql

我在mySQL数据库中有三个表,我用PHP查询:

玩家

player_id | player_name
-----------------------
1           Tom
2           Dick
3           Harry

游戏

game_id | game_name
-------------------
1         Tennis
2         Cricket
3         Rugby

gamePlayerRel

game_id | player_id
-------------------
1         2
1         3
2         3
3         2
3         3

我想要一个能够返回玩家ID和名称以及他们玩的游戏的查询。如果他们没有玩游戏 - 就像Tom(1)那样 - 那么我想要id和名称以及null0值。

期望的结果

player_id | player_name | game_id | game_name
---------------------------------------------
1           Tom           null      null
2           Dick          1         Tennis
2           Dick          3         Rugby
3           Harry         1         Tennis
3           Harry         2         Cricket
3           Harry         3         Rugby

我能得到的最接近的是以下查询:

SELECT players.player_id, players.player_name, gamePlayerRel.game_id, games.game_name
FROM players
INNER JOIN gamePlayerRel
INNER JOIN games
ON players.player_id = gamePlayerRel.player_id
AND gamePlayerRel.game_id=games.game_id

除非它没有为分配了游戏的玩家返回数据,否则它会关闭。在上面的示例中,结果是我想要的,除了Tom(1)的null值被遗漏。

我是一个超级菜鸟,所以如果我从错误的角度来看它,请说出来,如果你可以提出一个查询,那将会做我想你做的事情。

提前感谢您的任何帮助和建议。

3 个答案:

答案 0 :(得分:3)

这应该可以解决问题

SELECT players.player_id, players.player_name, gamePlayerRel.game_id, games.game_name
FROM players
    INNER JOIN gamePlayerRel ON players.player_id = gamePlayerRel.player_id
    LEFT OUTER JOIN games ON gamePlayerRel.game_id=games.game_id

您需要单独加入每个表格,并且还需要使用LEFT OUTER JOIN作为游戏桌。这将为players / gamePlayerRel表中的每个匹配至少提取一条记录。如果没有匹配,您将返回NULL值。

答案 1 :(得分:2)

要返回您显示的结果集,您需要实际执行两个外连接

SELECT players.player_id, players.player_name, gamePlayerRel.game_id, games.game_name
FROM players
    LEFT OUTER JOIN gamePlayerRel ON players.player_id = gamePlayerRel.player_id
    LEFT OUTER JOIN games ON gamePlayerRel.game_id=games.game_id

在你的情况下,这应该工作得很好,但是,我真正认为你要做的是游戏和gamePlayerRel之间的内部联接,然后是虚拟表和玩家表之间的左外连接。你可以通过以下方式实现这一目标:

SELECT players.player_id, players.player_name, playerGames.game_id,      playerGames.game_name
FROM players
    LEFT OUTER JOIN (Select gameplayerRel.player_id, games.game_id, games.game_name  from games inner join gamePlayerRel on games.game_id = gamePlayerRel.game_id) playerGames
       on players.player_id = playerGames.player_id

在你的情况下,你永远不需要这种替代语法,但是有些时候事情会变得混乱,因为两个左外连接方式在逻辑上并不完全相同。

这是一个SQL小提示,显示查询的results

我知道你正在使用mysql,但是这篇文章很好地解释了连接的细微差别,但它是为MSSQL编写的,尽管它应该同样适用于你。 http://weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx

答案 2 :(得分:0)

在被SO的乐于助人的方向推向正确的方向之后,我有一个查询能够完成我所追求的目标,但我仍然不能100%确定为什么它的工作原理。

SELECT players.player_id, players.player_name, gamePlayerRel.game_id, games.game_name
FROM players
INNER JOIN gamePlayerRel ON players.player_id = gamePlayerRel.player_id
LEFT OUTER JOIN games ON gamePlayerRel.game_id=games.game_id

感谢那些评论的人。这个网站再一次证明了我发现的最有用的一个:)