2013-03-17 4 views
14

MySQL 데이터베이스에 두 개의 테이블이 있다고 가정 해보십시오.MySQL 다중 열을 열로 결합하기

표 1

ID Name 
1  Jim 
2  Bob 

표 2

ID Place Race_Number 
1  2nd  1 
1  3rd  2 
1  4th  3 
2  1st  1 
2  2nd  2 
2  2nd  3 

데이터베이스에서 행을 선택했을 때, 제 테이블 컬럼으로서 제 2 표의 행을 가입 할 수있는 방법이 있는가? 현재 SELECT * FROM Table1 NATURAL JOIN Table2을 사용 중입니다.

이 출력 :

ID Name Place Race_Number 
1 Jim  2nd  1 
1 Jim  3rd  2 
1 Jim  4th  3 
2 Bob  1st  1 
2 Bob  2nd  2 
2 Bob  2nd  3 

현재 내 PHP 스크립트에서이를 통해 분류하고 배열로를 정렬합니다. 이것은 ID를보고 이들이 동일한 지 확인하고 그에 따라 분류해야하기 때문에 고통입니다. PHP에서 배열로 정렬 할 필요없이 MySQL에서이 작업을 수행 할 수있는 방법이 있다고 생각합니다. 두 번째 테이블에는 각 ID에 대해 무제한의 항목이있을 수 있습니다.

바로 MySQL의 쿼리에서 원하는 결과는 다음 각 ID에 대한 인종의 무제한이있을 수 있기 때문에 나는 테이블 자체 Race1, Race2 등을위한 열 수 없습니다

ID Name Race1 Race2 Race3 
1  Jim  2nd  3rd  4th 
2  Bob  1st  2nd  2nd 

.

도움 주셔서 감사합니다.

답변

28

INNER JOIN으로 충분합니다. MySQL은 PIVOT 함수가 없으므로, 여전히 CASEMAX() 함수를 사용하여 시뮬레이션 할 수 있습니다. 당신이 RACE의 알 수없는 번호가있는 경우

SELECT a.ID, a.NAME, 
     MAX(CASE WHEN b.Race_Number = 1 THEN b.Place ELSE NULL END) Race1, 
     MAX(CASE WHEN b.Race_Number = 2 THEN b.Place ELSE NULL END) Race2, 
     MAX(CASE WHEN b.Race_Number = 3 THEN b.Place ELSE NULL END) Race3 
FROM Table1 a 
     INNER JOIN Table2 b 
      ON a.ID = b.ID 
GROUP BY a.ID, a.Name 

는하지만, 다음 DYNAMIC SQL 훨씬 더 바람직하다.

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number, 
     ' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`')) 
    ) INTO @sql 
FROM Table2; 

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
        FROM Table1 a 
        LEFT JOIN Table2 b 
         ON ON a.ID = b.ID 
        GROUP BY a.ID, a.Name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

대단히 감사합니다! –

+2

당신은''D' –

+0

감사합니다 .. 동적 SQL 쿼리 부분은 내 문제를 해결하는 데 도움이 .. – Lucky

관련 문제