从“多对多”SQL关系中选择*

时间:2012-09-02 01:34:04

标签: mysql many-to-many inner-join

我还在学习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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

其中有两个单独的结果集,那么您将不得不进行两次查询。如果您想为每个团队设置不同的结果集,则必须为每个团队进行额外的查询。

话虽如此,我没有看到你的初始查询有太多错误,只是它为你提供了大量重复数据,以换取不必多次查询。