2012-09-02 45 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

我不知道你是否可以做你想问的问题,请参阅阿德里安康沃尔的答案,将所有球员放在一个专栏中。 –