2013-03-31 48 views
1

我有這樣的表結構得到多個值(我們稱之爲表teams):MySQL查詢到從1臺基於來自其它表中的多個列

id | player1 | player2 | player3 
1 | 13  | 25  | 50 

這(我們稱之爲表players):

id | pts 
13 | 5 
25 | 10 
50 | 12 

有沒有寫一個查詢來獲取pts vlaue每個從一排球員在表teams的方法嗎?

舉例來說,如果我想獲得PLAYER1的pts價值,我會做這樣的事情:

select teams.id,players.pts from teams left join players on teams.player1=players.id 

我需要一次爲所有3名球員做到這一點(在現實中,有18名球員,而不是3 - 但同樣的原則應該工作)。

我知道我可以通過他們循環,但似乎很難看到最佳解決方案。

+0

你可能會考慮規範化你的數據! – Strawberry

回答

1
SELECT 
    player1.pts AS player1_pts, 
    player2.pts AS player2_pts, 
    player3.pts AS player3_pts 
FROM 
    teams 
    LEFT JOIN players AS player1 ON team.player1=player1.id 
    LEFT JOIN players AS player2 ON team.player2=player2.id 
    LEFT JOIN players AS player3 ON team.player3=player3.id 
WHERE 
    ... 
+0

謝謝,我會用這個解決方案,因爲它解決了這個特殊問題(儘管我從其他答案中看到有更好的長期解決方案)。 – jovan

3

我想一個更好的辦法是將具有以下結構:

team_id | name 
---------------- 
1  | Team 1 
2  | Team 2 
3  | Team 3 

球員

player_id | pts 
--------------- 
1   | 10 
2   | 5 
3   | 25 

teams_players_外部參照

team_id | player_id 
------------------- 
1  | 1 
1  | 2 
2  | 3 

然後用下面的查詢:

SELECT 
    player_id, 
    pts 
FROM 
    teams_players_xrefs 
INNER JOIN 
    players USING (player_id) 
WHERE 
    team_id = 1 

得到以下結果:

player_id | pts 
--------------- 
1   | 10 
2   | 5 

這裏的SQL Fiddle

+0

很好的答案,我們必須同時輸入相同的答案 - 雖然你的信息更多,所以我想我會刪除我的。 – Steve

+0

我明白你的意思。但是,我不能那樣做。這是一個相當複雜(和現場)的幻想體育網站,在這一點上改變結構將需要數週的工作。這是因爲我還沒有提到其他問題,比如玩家位置,玩家之間的依賴關係等。 – jovan

1

你可以爲每個玩家加入players表,這可行,但並不是真正的理想解決方案。不幸的是,由於你的桌子結構是你能做的最好的。

創建一個映射表,映射團隊與玩家會好得多。例如:

CREATE TABLE teams 
(
    id INT, 
    PRIMARY KEY(id) 
); 

CREATE TABLE team_players 
(
    team_id INT, 
    player_id INT 
) 

這將允許您通過team_id查詢並輕鬆返回該團隊內的所有玩家。