2013-11-21 3 views
1

У меня есть таблица с некоторыми ссылками на имена.Возвращающиеся столбцы в виде строк

С запросом:

SELECT id, n1, n2, n3 
FROM nametable 

табличные возвращается:

+----+--------+-------+--------+ 
| id | n1 | n2 | n3 | 
+----+--------+-------+--------+ 
| 1 | Larry | Bob | Mo  | 
| 2 | Sara | May | (NULL) | 
| 3 | Keiran | Lenny | (NULL) | 
+----+--------+-------+--------+

Я хотел бы вернуть его как:

+----+--------+ 
| id | n | 
+----+--------+ 
| 1 | Larry | 
| 1 | Bob | 
| 1 | Mo  | 
| 2 | Sara | 
| 2 | May | 
| 3 | Keiran | 
| 3 | Lenny | 
+----+--------+

Обратите внимание, что значения (NULL) не являются возвращается в окончательном результате

Я провел некоторое исследование и нашел нечто, называемое «сводные таблицы». Однако ни один из примеров не соответствует моему состоянию. В котором я хотел бы сохранить идентификатор в каждой строке.

Как мне сделать это с помощью запросов?

+1

Я не верю, что MySQL имеет «PIVOT», например, SQL Server. –

ответ

3

Я думаю, что это ближайший в MySQL:

select * from (
(select id, n1 as n from nametable) union all 
(select id, n2 as n from nametable) union all 
(select id, n3 as n from nametable) 
) x 
0

Вы также можете UNPIVOT ваш стол таким образом

SELECT id, 
     CASE n 
      WHEN 1 THEN n1 
      WHEN 2 THEN n2 
      WHEN 3 THEN n3 
     END n 
    FROM nametable t CROSS JOIN 
(
    SELECT 1 n UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 
) i 
HAVING n IS NOT NULL 
ORDER BY id, n; 

Выход:

 
| ID |  N | 
|----|--------| 
| 1 | Bob | 
| 1 | Larry | 
| 1 |  Mo | 
| 2 | May | 
| 2 | Sara | 
| 3 | Keiran | 
| 3 | Lenny | 

Вот SQLFiddle демо

Смежные вопросы