2012-10-19 2 views
3

내가 농구 리그 테이블 AF 팀의 테이블이 같은 선수의 테이블이 있습니다행 재정의없이 JOIN 후 SQL : GROUP BY?

LEAGUES 
ID | NAME | 
------------------ 
1 | NBA  | 
2 | ABA  | 

TEAMS: 
ID | NAME | LEAGUE_ID 
------------------------------ 
20 | BULLS | 1 
21 | KNICKS | 2 

PLAYERS: 
ID | TEAM_ID | FIRST_NAME | LAST_NAME | 
--------------------------------------------- 
1 |  21 | John  | Starks |  
2 |  21 | Patrick | Ewing |  

리그 ID 감안할를, 나는 모든에서 모든 선수의 이름과 자신의 팀 ID를 검색하고 싶습니다

SELECT t.id AS team_id, p.id AS player_id, p.first_name, p.last_name 
FROM teams AS t 
JOIN players AS p ON p.team_id = t.id 
WHERE t.league_id = 1 

반환 : 그 리그에서 팀은, 그래서 나는 이렇게

[0] => stdClass Object 
    (
     [team_id] => 21 
     [player_id] => 1 
     [first_name] => John 
     [last_name] => Starks 
    ) 

[1] => stdClass Object 
    (
     [team_id] => 21 
     [player_id] => 2 
     [first_name] => Patrick 
     [last_name] => Ewing 
    ) 

+ around 500 more objects... 

나는 저를 드롭 다운을 채울이 결과를 사용하기 때문에 각 팀의 선수 목록이 포함 된 각 팀마다 팀 ID로 결과를 그룹화하고 싶습니다. 따라서이 드롭 다운을 만드는 루프는 매번 500 명이 넘는 모든 선수 대신 각 팀 ID를 순환해야합니다.

하지만이 같은 GROUP BY를 사용하는 경우 :

에만 있기 때문에 같은 열 이름의 사용 같은 팀에있는 모든 다른 플레이어를 오버라이드 (override)과 같은 각 팀에서 한 선수를 반환
SELECT t.id AS team_id, p.id AS player_id, p.first_name, p.last_name 
FROM teams AS t 
JOIN players AS p ON p.team_id = t.id 
WHERE t.league_id = 1 
GROUP BY t.id 

.

[0] => stdClass Object 
    (
     [team_id] => 21 
     [player_id] => 2 
     [first_name] => Patrick 
     [last_name] => Ewing 
    ) 
[1] => stdClass Object 
    (
     [team_id] => 22 
     [player_id] => 31 
     [first_name] => Shawn 
     [last_name] => Kemp 
    ) 
etc... 

나는 이런 식으로 뭔가를 반환하고 싶습니다 :

[0] => stdClass Object 
    (
     [team_id] => 2 

     [player_id1] => 1 
     [first_name1] => John 
     [last_name1] => Starks 
     [player_id2] => 2 
     [first_name2] => Patrick 
     [last_name2] => Ewing 

     +10 more players from this team... 
    ) 

    +25 more teams... 

는 것이 가능 어떻게 든 있습니까?

+0

사용하는 데이터베이스를 지정하십시오! – ppeterka

+0

sql result는 1 차원 배열 만 반환합니다. 그것은 귀하의 코드에 전달되어야합니다. –

+0

죄송합니다. MySQL을 사용하고 있습니다. – acrmuui

답변

4

데이터 형식으로 결과를 나타낼 수 없기 때문에 SQL에서는이 작업을 수행 할 수 없습니다. 복잡한 객체를 반환하려고합니다. 할 수있는 일은 코드에서이를 처리하고 team_id로 정렬 된 데이터 세트를 반환하여 도움을주는 것입니다. team_id가 변경 될 때마다 코드에 새 객체를 만들고 새 플레이어 목록으로 채울 시간입니다.

그것은이 같은 (구문이 정확하지 않을 수 있습니다) 다음과 같습니다

반환 된 결과 집합 :

team_id|player_id|first|last 
1|1|f1|l1 
1|2|f2|l2 
1|3|f3|l3 
2|5|f5|l5 
2|6|f6|l6 

그리고 이것은 코드에서 반환 될 때

$lastTeamId=0; 
$output=array(); 
foreach($results as $row){ 
    if($lastTeamId != $row["team_id"]){ 
    $lastTeamId = $row["team_id"]; 
    $output[$lastTeamId] = array(); 
    } 

    $newPlayer = null; 
    $newPlayer->id = $row["player_id"]; 
    $newPlayer->first = $row["first"]; 
    $newPlayer->last = $row["last"]; 
    $output[$lastTeamId][] = $newPlayer; 
} 
+0

쿼리가 해당 리그의 각 팀마다 동적으로 구축되는 저장 프로 시저에서 수행 할 수 있습니다. 그러나 클라이언트 측 코드에서 처리하는 것은 확실히 간단합니다. –

+0

Aleksandar 도와 주셔서 대단히 감사합니다! – acrmuui

0

MySQL의에서 , 당신은 team_id에 의해 GROUP BY GROUP_CONCAT (player detail ...)를 선택할 수 있습니다. 그러나 이는 제한 사항으로 이어지고 전형적인 관계형 접근법이 아닙니다.