INNER JOIN的条件给出了错误的结果

时间:2016-05-23 13:51:19

标签: sql database postgresql inner-join

我有以下表格

      goal                    matches                 team_match

id | match_id | team_id | name     match_id      team_id | match_id | home_away
-----------------------------       -----        ------------------------------
1         1      1       Ronaldo       1             1         1        home
2         1      2       Messi                       2         1        away
3         1      2       Suarez                      2         1        away

现在我想得到那些在客场球队打球的球员。

SELECT DISTINCT g.name
FROM goal g

INNER JOIN matches m
ON g.match_id = m.match_id

INNER JOIN team_match tm
ON tm.match_id = m.match_id
AND tm.home_away = 'away'

WHERE m.match_id = '1' 

但不是:

 Messi
 Suarez 

我得到了:

 Ronaldo
 Messi
 Suarez 

它的接缝就像我的第二个INNER JOIN被完全忽略,即使我从“home”变为“away”我也会得到相同的结果。

2 个答案:

答案 0 :(得分:4)

INNER JOIN正常运作。似乎您的数据库架构是问题。

为什么不应该Ronaldo在结果集中?你不能在任何地方使用team_id。在指定的匹配中,Ronaldo团队中没有home的信息。

建议更好的架构:

Table teams
team_id
1
2

Table players:
playerid team_id name
1        1       Ronaldo
2        2       Messi
3        2       Suarez

Table matches
matchid hometeamid awayteamid
1       1          2

Table goals
matchid playerid
1       1
1       2
1       3

然后您的查询可能如下所示

SELECT p.Name FROM players p
INNER JOIN goals g ON (g.playerid = p.playerid)
INNER JOIN matches m ON (m.matchid = g.matchid AND m.awayteamid = p.team_id)
WHERE m.matchid = 1

答案 1 :(得分:0)

您还没有证明第一个内部联接正在发挥作用。 尝试删除空行