복붙노트

[SQL] 열 이름으로 다른 값으로 열을 동적 행 값을 선택 MYSQL

SQL

열 이름으로 다른 값으로 열을 동적 행 값을 선택 MYSQL

나는 (활성 아직 사용) 사용자 정보의 유산 테이블을하고 난의 구조를 변경할 수 없습니다 -

id    name       value
------------------------------
0     timezone   Europe/London
0     language   en
0     country    45
0     something  x
1     timezone   Europe/Paris
1     language   fr
1     country    46

등 시간대 / 언어 / 국가들이 변수가 될 수있는, 이름의 예 / 해당 열의 행에서 고유 이외의 유한 목록이 없습니다

나는 반환 MySQL의 호환 SQL 쿼리가 필요합니다 -

id    timezone       language    country  something
---------------------------------------------------
0     Europe/London  en          45       x
1     Europe/Paris   fr          46

나는 MySQL은, 및 유사하여 피벗 테이블 기능을 해킹 주위 유래에 대한 다양한 답변을 통해 검토 한하지만 그들 중 누구도 같은 테이블의 열에서 고유 한 행 값에서 변수 열 이름 별칭을 사용하여이 경우에 맞게 보이지 않는다. 그들은 모두 사전에 사과 흐림 약간되기 시작하고, 그래서 나는 거의 잠을 가지고 있지만.

내가 찾을 수있는 가장 가까운, 그리고 / 또는 여러 개의 하위 이름 열에서 가능한 모든 / 고유 값을받을 것이다 준비된 문 https://stackoverflow.com/a/986088/830171을 사용할 때 사용 사례 쿼리를 작성하는 것입니다 SELECT 또는 동일한 테이블 쿼리에 가입하세요.

내가 생각할 수있는 대안이 해당 사용자 ID에 대한 모든 행을 얻을 수와 대한 루프에서 응용 프로그램 자체를 처리하거나, 유한 한 금액과 사용 하위 SELECT들에 이름을 제한하려고 시도합니다 / 조인. 그러나 그 두 번째 옵션은 새 이름 난이 쿼리를 다시 방문해야 할 것 추가되는 경우 적합하지 않습니다.

말해 나는 분명 뭔가를 놓친하세요

해결법

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

    1.다른 RDBMS MySQL은 디자인에 의해 이런 종류의 작업을 선회에 대한 기본 지원을 (개발자가 더 오히려 데이터베이스보다, 프리젠 테이션에 적합한 것 응용 프로그램의 계층을 느낄 수)이없는 달리.

    다른 RDBMS MySQL은 디자인에 의해 이런 종류의 작업을 선회에 대한 기본 지원을 (개발자가 더 오히려 데이터베이스보다, 프리젠 테이션에 적합한 것 응용 프로그램의 계층을 느낄 수)이없는 달리.

    당신이 절대적으로 MySQL을 내 같은 조작을 perfom해야하는 경우 준비된 문을 작성하는 것은 이동-있지만 오히려 CASE와 장난보다, 나는 아마의 MySQL의 GROUP_CONCAT () 함수를 사용하려는 방법입니다 :

    SELECT CONCAT(
      'SELECT `table`.id', GROUP_CONCAT('
         ,    `t_', REPLACE(name, '`', '``'), '`.value
             AS `', REPLACE(name, '`', '``'), '`'
         SEPARATOR ''),
     ' FROM `table` ', GROUP_CONCAT('
         LEFT JOIN `table`   AS `t_', REPLACE(name, '`', '``'), '`
                ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
               AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
         SEPARATOR ''),
     ' GROUP BY `table`.id'
    ) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;
    
    PREPARE stmt FROM @qry;
    EXECUTE stmt;
    

    sqlfiddle에를 참조하십시오.

    GROUP_CONCAT의 결과 ()가 group_concat_max_len 변수에 의해 제한됩니다 (1024 바이트의 기본 : 당신은 몇 가지 매우 긴 이름 값을하지 않는 한 여기에 관련 될 가능성).

  2. from https://stackoverflow.com/questions/10925445/mysql-select-dynamic-row-values-as-column-names-another-column-as-value by cc-by-sa and MIT license