Преобразовать пары имя-значение, хранящиеся в виде строк, в столбцы - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть следующая таблица:

ID  | FieldName     | FieldValue
--------------------------------
01  | event_name    | Event Title
01  | event_cost    | 10.00
01  | event_loc     | Leeds
02  | event_name    | Another Event
02  | event_cost    | 15.00
02  | event_loc     | London

Я хочу запросить это и вернуть результаты следующим образом:

Title           | Cost  | Location
------------------------------------
Event Title     | 10.00 | Leeds
Another Event   | 15.00 | London

Каков наилучший способ сделать это? Я пытался использовать запрос SELECT, но я могу вернуть только одно значение поля и не могу присоединиться к ним.

Ответы [ 5 ]

0 голосов
/ 17 сентября 2018

Попробуйте этот запрос:

SELECT event_name AS 'Title', event_cost AS 'Cost', event_loc AS 'Location' 
FROM yourTableName
0 голосов
/ 17 сентября 2018

Вы можете сделать условное агрегирование:

select max(case when FieldName = 'event_name' then FieldValue end) as Title,
       max(case when FieldName = 'event_cost ' then FieldValue end) as Cost,
       max(case when FieldName = 'event_loc' then FieldValue end) as Location
from table t
group by id;
0 голосов
/ 17 сентября 2018

вариант использования, когда

select id, max( case when FieldName='event_name' then FieldValue end) as Title,
max(case when FieldName='event_cost' then FieldValue end) as cost,
max(case when FieldName='event_loc' then FieldValue end) as Location from t
group by id

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=940326493ef7b561375953f85f65a4ea

id  Title   cost    Location
1   Event Title     10.0    Leeds
2   Another Event   15.0    London
0 голосов
/ 17 сентября 2018

Использовать условную агрегацию.GROUP_CONCAT может использоваться для возврата списка через запятую, если есть несколько совпадений для определенного имени поля.

SELECT
    ID,
    GROUP_CONCAT(CASE WHEN FieldName = 'event_name' THEN FieldValue END) AS Title,
    GROUP_CONCAT(CASE WHEN FieldName = 'event_cost' THEN FieldValue END) AS Cost,
    GROUP_CONCAT(CASE WHEN FieldName = 'event_loc'  THEN FieldValue END) AS Location
FROM yourdata
GROUP BY ID
0 голосов
/ 17 сентября 2018

Вариант использования, когда и агрегация:

select max(case when fieldname='event_name' then FieldValue) as title,
max(case when fieldname='event_cost' then FieldValue) as cost,
max(case when fieldname='event_loc' then FieldValue) as location,
from tablename group by id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...