我在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和名称以及null
或0
值。
预期的结果
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
值被忽略了。
我是一个超级新手,所以如果我从错误的角度来,请告诉我,如果你能建议一个查询,将做什么我之后,你会让我的一天。
提前感谢您的帮助和建议。
要返回结果集,需要执行两个外部连接
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 Fiddle
我知道您正在使用mysql,但本文很好地解释了连接的细微差别,但它是为MSSQL编写的,尽管它应该同样适用于您。http://weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx
应该可以了
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
值。
在被推动在正确的方向,所以我有一个查询,做什么我之后,虽然我仍然不是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
感谢那些评论的人。这个网站再次证明了我所发现的最有用的网站之一:)