2013-12-23 5 views
1

У меня есть следующая таблица:Как преобразовать строки в столбцы без GROUP_CONCAT?

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

Мне нужно создать файл .CSV из него для последующей обработки:

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

я могу выбрать все языки, как ряд с помощью GROUP_CONCAT:

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

Он выдает результат:

id | name 
---+-------------------- 
1 | Hello!;¡Hola!;Salut! 

Однако для этого требуется специальная обработка столбца «name» в коде, поскольку перед тем, как я могу продолжить, я должен tokenize конкатенированную строку.

мне было интересно, если есть способ, чтобы получить результат, как это:

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

Так что я могу обрабатывать столбцы единообразно.

Спасибо.

ответ

2

Вы хотите pivot, который изначально не поддерживается в MySQL, но достаточно легко кода:

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'. Он выглядит более элегантным, чем '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 
Смежные вопросы