2012-09-02 46 views
4

我仍然在學習SQL,而我的大腦與這個關係很難。從「多對多」的SQL關係中選擇*

說我有3個表:

teams 
players 

teams_players作爲我的鏈接表

所有我想要做的就是運行一個查詢來獲取每個團隊和他們的球員。

我嘗試這樣做:

SELECT * 
FROM teams 
INNER JOIN teams_players 
    ON teams.id = teams_players.team_id 
INNER JOIN players 
    ON teams_players.player_id = players.id 

但它返回一個單獨的一行每隊每個球員。加入正確的方式來做到這一點,或者我應該做其他事情嗎?

-----------------------------------------編輯

好吧,從我聽到的情況來看,這不一定是一種不好的方法。當我正在做循環時,我將不得不按照團隊對數據進行分組。

我還沒有嘗試過提供的修改過的SQL語句,但我今天會回覆給您。

要回答關於結構的問題 - 我想我沒有想到返回的行結構是導致我混淆的一部分。在這種特殊情況下,每隊僅限於4人(或更少),所以我想這將有助於我的結構是類似如下:

teams.id, teams.name, players.id, players.name, players.id, players.name, players.id, players.name, players.id, players.name, 
1   Team ABC 1   Jim   2   Bob   3   Ned   4    Roy 
2   Team XYZ 2   Bob   3   Ned   5   Ralph  6    Tom 
+1

編輯你的SQL語句讓它在屏幕上更具可讀性如果你不介意 –

+3

這看起來像預期的行爲。你能舉一個你期望的結果行的例子嗎?我不知道如何將球隊和所有球員作爲結果集中的一排返回。 –

+0

如果您想要特定團隊的結果 - 您需要添加一個將結果限制爲特定團隊的「WHERE」子句。哦,'SELECT *'被大多數DBA所詬病,所以你應該指定你想要的列 –

回答

3

確定這是一個猜測,但你想有一個團隊,在團隊球員上一行列表

如何

SELECT t.id, GROUP_CONCAT(p.id) 
FROM teams t 
INNER JOIN teams_players tp 
    ON t.id = tp.team_id 
INNER JOIN players p 
    ON tp.player_id = p.id 
GROUP BY t.id 

手冊可以幫助http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_group-concat

+0

這基本上是我在找的東西。將所有玩家放在一起作爲一個字符串,如果需要的話,我可以輕鬆爆發。謝謝! –

1
以表格形式

MySQL將返回數據,所以考慮如何在一個表/結果集中返回一個球員和球隊列表,包括每個球員關聯哪支球隊,而不會爲球隊中的每個球員返回一個單獨的列?

你的查詢應返回:

team.id, team.name, player.id, player.name 
1  team1  1   player1 
1  team1  2   player2 
2  team2  3   player3 
2  team2  4   player4 

如果你想要像

team.id, team.name 
1  team1 
2  team2 

player.id, player.name, team.id 
1   player1  1 
2   player2  1 
3   player3  2 
4   player4  2 

它有兩個單獨的結果集,那麼你就必須做出兩個查詢。如果您想要爲每個團隊設置不同的結果集,則必須爲每個團隊進行額外的查詢。

這就是說,我沒有看到任何與你的初始查詢有太大的不同之處,除了它給你很多重複的數據以換取不必做多個查詢。

+0

這是有幫助的 - 我沒有考慮到返回的結構必須一致。請參閱我上面的編輯。 –

+0

我不知道你是否可以做你想問的問題,請參閱阿德里安康沃爾的答案,將所有球員放在一個專欄中。 –