2016-04-07 2 views
0

Я пытаюсь извлечь данные из базы данных MySQL. Структура таблицы (Tab_1) есть:Преобразование нескольких строк в столбцы

id key  value 
1 address xyz 
1 post_code 120 
1 country CA 

Как вы можете видеть, что это на самом деле детали заказа информации.

Я хочу, чтобы ключевой столбец был фактическим столбцом, а значение - значением этого столбца. смысл:

id address post_code country 
------------------------------------ 
    1 xyz  120   CA 

Где id=1 ключ этого порядка.

Таблица в MySQL не может быть изменена. Его часть близкой системы, которую мы используем (плагин WordPress), я просто хочу написать запрос, который получает некоторые данные из него ...

Моя цель - использовать его в объединении, где было бы легче получить данные:

Select x.address ,x.post_code, x.country 
from orders 
join (...) as x using (order_id=id) 
where order_id=1 

это должно дать:

address post_code country 
------------------------------------ 
     xyz  120   CA 

Как вы можете видеть, что это предполагают, чтобы получить все поля х, является адрес, post_code, страна и т.д. ... в соединении, где Мне нужно поставить запрос, который преобразует Tab_1 к удобочитаемому разрыву для соединения.

Как я могу это сделать?

+0

GROUP BY, тематические выражения для различных типов ключей ,. – jarlh

+0

Группа не решит этот вопрос. он не преобразует значения в столбцы .. Обратите внимание, что 'key' должен стать столбцом, а' value' должен стать значением в этом столбце. Когда я говорю в select 'x.address', я хочу, чтобы он дал мне« xyz ». – java

ответ

2

сделать GROUP BY, используйте CASE выражения для различных типов ключей:

select id, 
     max(case when key = 'address' then value end) as address, 
     max(case when key = 'post_code' then value end) as post_code, 
     max(case when key = 'country' then value end) as country 
from orders 
group by id 
+0

Почему вы используете Max? – java

+0

Чтобы выбрать ненулевое значение. Вы также можете использовать MIN. (Я предполагаю, что есть только один адрес/post_code/страна на один идентификатор.) – jarlh

+0

да есть только один ... вот почему я не понимаю, почему max или min необходимо ... – java

0

Вы можете использовать только 4 выбирает:

SELECT id, (SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'address') AS address, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'post_code') AS post_code, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'country') AS country FROM Tab_1 
GROUP BY id; 
+1

Если вы делаете это, по крайней мере, коррелировали подзапросы. (Теперь вы всегда возвращаете значения id = 1). – jarlh

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