2012-09-02 3 views
4

나는 아직도 SQL을 배우고 있으며, 나의 두뇌는 이걸 가지고 힘든 시간을 보내고있다. 내 링크 테이블Select * from many to many SQL 관계

나는 각 팀 및 그들에 선수를 얻을 수있는 쿼리를 실행하고 싶은 모든 같은

teams 
players 

teams_players :

내가 3 개 테이블을 말해봐.

나는이 시도 :

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

을하지만 각 팀에 각 선수에 대한 별도의 행을 반환했습니다. JOIN이 올바른 방법으로 참여하고 있습니까? 아니면 내가 다른 것을해야합니까?

----------------------------------------- 편집

좋아, 내가 듣고있는 것부터, 반드시 그렇게하는 것은 나쁜 방법은 아니다. 내가 루프를 수행하는 동안 팀별 데이터를 그룹화해야합니다.

아직 수정 된 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을 편집 도움이 될 수 있습니다 방법에 대한

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 

한 행에 팀의 선수 목록

을 원하는 마음에 들지 않으면 화면에서 더 쉽게 읽을 수 있습니다. –

+3

이것은 예상되는 동작처럼 보입니다. 기대하는 결과 열의 예를 들어 줄 수 있습니까? 팀과 모든 플레이어를 결과 집합의 행으로 반환하는 방법을 알지 못합니다. –

+0

특정 팀에 대한 결과를 원하면 결과를 특정 팀으로 제한하는 WHERE 절을 추가해야합니다. 오,'SELECT *'는 대부분의 DBA의 눈살을 찌푸리게합니다. 따라서 원하는 컬럼을 지정해야합니다. –

답변

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

내가 원하는 것을 할 수 있는지 모르겠다. Adrian Cornish의 대답을보고 모든 플레이어를 단일 열에 배치하십시오. –