2013-12-23 4 views
1

나는 다음과 같은 테이블이 있습니다행을 GROUP_CONCAT없이 열로 변환하는 방법은 무엇입니까?

greeting.csv: 
--------------------- 
id;en;es;fr 
1;Hello!;¡Hola!;Salut! 
---------------------

내가 GROUP_CONCAT을 사용하여 행으로 모든 언어를 선택할 수 있습니다 :

greeting: 
+-------------------------+ 
| id | lang_id | name  | 
+-------------------------+ 
| 1 | 1  | 'Hello!' | 
| 1 | 2  | '¡Hola!' | 
| 1 | 3  | 'Salut!' | 
+----+---------+----------+

난 이후의 처리를 위해 그것의 .CSV 파일을 작성해야

012 :
SELECT 
    id, 
    GROUP_CONCAT(name SEPARATOR ';') as 'name' 
FROM 
    greeting 
WHERE 
    greeting.id = 1; 

그것은 결과를 생산

그러나 진행하기 전에 연결 문자열을 토큰 화해야하므로 코드에서 'name'열의 특수 처리가 필요합니다.

id | en  | es  | fr 
---+--------+--------+------- 
1 | Hello! | ¡Hola! | Salut!

그래서 내가 균일하게 열을 처리 할 수 ​​있습니다하십시오 얻을이 같은 결과에 방법이 있는지

궁금 해서요.

감사합니다.

답변

2

당신은 기본적으로 MySQL의에서 지원되지 않는 pivot를 원하지만 코드 충분히 쉽게 :

SELECT 
    t1.id, 
    t1.name en, 
    t2.name es, 
    t3.name fr 
FROM greeting t1 
JOIN greeting t2 ON t1.id = t2.id AND t2.lang_id = 2 
JOIN greeting t2 ON t1.id = t3.id AND t3.lang_id = 3 
WHERE t1.lang_id = 1 
AND t1.id = 1 

당신은 모든 인사를 얻을 수있는 최종 상태 t1.id = 1를 생략 할 수있다.

+0

답변 해 주셔서 감사합니다. 조인으로도 해결하려고했지만 'AND t2.lang_id = 2'부분을 지정하는 것을 잊어 버렸기 때문에 가능한 모든 언어와 ID의 조합을 얻고있었습니다. 'MAX (CASE ...) '보다 더 우아 해 보입니다. 답장으로 답장을 수락하겠습니다. –

2
SELECT 
    id, 
    MAX(CASE WHEN lang_id=1 THEN name END) eng, 
    MAX(CASE WHEN lang_id=2 THEN name END) es, 
    MAX(CASE WHEN lang_id=3 THEN name END) fr 
FROM 
    yourtable 
GROUP BY 
    id 
관련 문제