2016-05-23 11 views
0

I持って、次の表 条件は、間違った結果に

 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がようですが、縫い目完全に「私は、 "自宅" から変更しても、無視されます私は同じ結果を得るでしょう。

+1

ようになります。あなたの質問には十分な情報がありません。 –

+1

スキーマの問題。最初のテーブルにteam_idが必要 – swe

+0

現在のクエリの内部ジョインは、クロスジョインのように機能しています。あなたのテーブル1とテーブル3の間に追加の一致基準が必要になります。 – Drishya1

答えて

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 

次に、あなたのクエリは、3番目のテーブルにteam_id` `に参加する必要があり、この

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 
+0

を登録しよ最後INNERに追加することで問題を解決した「とtm.team_id = g.team_id」。しかし、私はテーブル "目標"に列 "team_id"があることを書くことを忘れて、私はそれを編集します。最後のINNER JOINに "AND tm.team_id = g.team_id"を追加して問題を解決しました –