【问题标题】:Condition with INNER JOIN gives wrong resultsINNER JOIN 的条件给出错误的结果
【发布时间】:2016-09-20 10:39:28
【问题描述】:

我有以下表格

      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 完全被忽略了,即使我从“家”更改为“离开”,我也会得到相同的结果。

【问题讨论】:

  • 您需要加入第三张表中的team_id。您的问题没有足够的信息。
  • 架构问题。在第一个表中需要 team_id
  • 当前查询中的内部联接就像交叉联接一样工作。您需要在表 1 和表 3 之间添加额外的匹配条件。
  • 是的,我忘了写我在表“目标”中有列“team_id”,我编辑了它。我通过在最后一个 INNER JOIN 中添加“AND tm.team_id = g.team_id”解决了这个问题

标签: sql database postgresql inner-join


【解决方案1】:

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

【讨论】:

  • 是的,我的数据库架构应该会好很多。但是,我忘了写我在“目标”表中有“team_id”列,我将对其进行编辑。我通过在最后一个 INNER JOIN 中添加“AND tm.team_id = g.team_id”解决了这个问题
【解决方案2】:

您还没有证明第一个内部联接也有效。 尝试删除空行

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多