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

标签 php mysql

我正在使用 PHP 查询 mySQL 数据库中的三个表:

玩家

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 和姓名以及他们玩的游戏的查询。如果他们不玩游戏——如汤姆 (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 值被排除在外。

我是这方面的 super 菜鸟,所以如果我从错误的角度来看它,请这样说,如果你能提出一个查询来满足我的要求,你会让我开心。

在此先感谢您的帮助和建议。

最佳答案

要像您展示的那样返回结果集,您需要实际执行两个外部联接

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

在您的情况下,这应该可以正常工作,但是,我真正认为您想要做的是 games 和 gamePlayerRel 之间的内部连接,然后是该虚拟表和 players 表之间的 Left Outer Join。你可以通过这样的事情来完成:

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

在您的情况下,您永远不需要这种替代语法,但有时事情会变得一团糟,因为两个左外连接方式在逻辑上并不完全等同。

这是一个显示 results 的 SQL Fiddle的查询

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

关于php - 使用三个表和一些空值的 SQL 连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16065565/

相关文章:

php - Sylius 上的国际扩展

mysql - 在同一字段的 SQL WHERE 子句中使用 'AND'

PHP 本地主机应用程序连接到服务器数据库

php - Yii 触发多个查询而不是一个

php - 在 PHP 网站中使用 Jasper 报告

php - 无法使用 PDO 将照片更新到数据库中

PHP检测搜索是否为日期

mysql - 使用随机索引和 RAND( ) 获取随机行

mysql - 如何从表格和最多两个其他项目中进行选择

mysql - Magento 报告客户愿望 list