2012-05-25 63 views
3

爲了擴展我以前的問題 - 我的數據庫中有兩個表,我想提取某些信息。如下表:SQL:連接到同一主數據庫的多個外鍵的表(2)

(player): player_id (primary), playerName 
    (match): match_id (primary), playerID1, playerID2, playerID3, scorer etc.. 

你給我提供了下面的代碼來獲得的球員的名字:

SELECT p.Name 
FROM `match` m 
INNER JOIN `player` p 
    ON p.player_id IN (m.playerID1, m.playerID2, m.playerID3) //etc 

作品beauitfully感謝 - 但只是兩個調整,我想作:

1)我想返回得分手的名字以及球員的名字。由於m.scorer是一個ID,如果p.Name已經映射到m.playerID,我如何將它映射到p.Name屬性? 2)上面的查詢返回所有玩家的名字。我很快就會添加一個搜索功能,以便爲某個玩家搜索所有匹配項。是否有排除該球員的結果(因爲我們已經知道這名球員是在比賽中,因爲他被搜查)。因此,幾乎所有的比賽都會返回給某位球員,但是從結果中排除實際搜索到的球員。對不起,如果這不清楚,讓我知道,我會擴大它。

再次感謝了很大的幫助

+0

表是完全錯誤的(這就是爲什麼你需要擺弄)。 'match'表不應該有'player_ds'列表作爲列的列表,這會打破2NF。即使你有這個問題「固定」,這將導致未來大量問題。你應該有一個'match_player(match_id,player_id,score)'和PK'(match_id,player_id)'。這消除了所有問題,並且** any **查詢所需的代碼將變得簡單。 「多個PK引用一個父母」是一個不同的問題,而不是一個問題.. – PerformanceDBA

回答

3

嘗試像以下(假設字段名)。它會顯示玩家的名字,比賽的matchId以及他們是否在比賽中得分。

SELECT p.Name as 'Player Name', m.matchId as 'Match Id', 
CASE s.scorerId WHEN ISNULL(S.SCORERID,0) THEN 'YES' ELSE 'NO' END as 'Scored?', 
s.name as 'Scorer Name' --as requested from comment 
FROM match m 
INNER JOIN player p ON p.player_id IN (m.playerID1, m.playerID2, m.playerID3) 
LEFT JOIN scorer s ON s.matchId = m.matchId 
    AND s.player_id IN (m.playerID1, m.playerID2, m.playerID3) 

看到這個SQLFiddle HERE

+0

嗨!非常感謝偉大的代碼,我沒有考慮爲記分員創建一個新表。是否有一種操作代碼的方式,以便我在得分手列中返回得分手名稱?我知道在這裏看起來很愚蠢,得到的名字,然後再次得分手的名字,但它會有意義,當我稍後申請一些PHP代碼。再次感謝! – user1416876

+0

沒問題!檢查我的編輯,我已經將's.nams作爲'Scorer Name''添加到查詢中:)。 – mattytommo

+0

嗨!表'記分員'沒有名字欄 - 我需要添加嗎?希望我可以從playerName鏈接它,所以我沒有存儲兩次相同的數據。 – user1416876

相關問題