如何在没有GROUP_CONCAT的情况下将行转换为列?

时间:2013-12-23 09:26:28

标签: mysql sql

我有下表:

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'列进行特殊处理,因为我必须先对连接的字符串进行标记,然后才能继续。

我想知道是否有办法得到这样的结果:

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

所以我可以统一处理列。

感谢。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

你想要一个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来获取所有问候语。