복붙노트

[SQL] 열 등 여러 행을 가입 MYSQL

SQL

열 등 여러 행을 가입 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

데이터베이스에서 행을 선택할 때 첫 번째 테이블에 열로 두 번째 테이블에서 행을 가입 할 수있는 방법은 무엇입니까? 현재 내가 표 NATURAL로부터 SELECT *를 사용하고는 표 2 가입하세요.

이 출력 :

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    Name    Race1    Race2    Race3
1     Jim     2nd      3rd      4th
2     Bob     1st      2nd      2nd

각 ID에 대한 인종의 무제한이있을 수 있기 때문에 나는 테이블 자체 Race1, Race2 등을위한 열 수 없습니다.

어떤 도움을 주셔서 감사합니다!

해결법

  1. ==============================

    1.내부 사용자의 요구에 충분 가입하세요. MySQL은 여전히 ​​CASE 및 MAX () 함수를 사용하여 시뮬레이션 할 수 없음 PIVOT 기능이 없습니다.

    내부 사용자의 요구에 충분 가입하세요. MySQL은 여전히 ​​CASE 및 MAX () 함수를 사용하여 시뮬레이션 할 수 없음 PIVOT 기능이 없습니다.

    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
    

    당신이 인종의 알 수없는 번호가있는 경우, 그때 동적 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;
    
  2. from https://stackoverflow.com/questions/15462753/mysql-join-multiple-rows-as-columns by cc-by-sa and MIT license