2013-03-19 9 views
2

У меня есть две таблицы троек и меткисводной таблицы с помощью MySQL

троек Таблица содержит следующие столбцы

id PostID TagID Value 
    1 1  1  Murder 
    2 1  2  New Brunswick 
    3 2  1  Theft 
    4 2  3  Gun 

Метки Таблица содержит следующие столбцы

id TagName 
    1 Incident 
    2 Location 
    3 Weapon  

Я пытаюсь написать SQL для создания сводной таблицы с динамическими заголовками

Выход должен быть таким:

 PostID Incident Location   Weapon   
      1 Murder  New Brunswick  
      2 Theft      Gun 

Любая помощь в написании SQL будет оценена по достоинству. Я видел примеры в Интернете, но не мог понять это один

+0

SQLFiddle (http://sqlfiddle.com) является большим ресурсом для тестирования идей. –

+0

Возможный дубликат [MySQL pivot row в динамическое число столбцов] (http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns) – RichardTheKiwi

ответ

11

Для поворота данных в MySQL, вам нужно будет использовать как агрегатную функцию и выражение CASE.

Если у вас есть известное количество столбцов, то вы можете жестко закодировать запрос:

select p.postid, 
    max(case when t.tagname = 'Incident' then p.value end) Incident, 
    max(case when t.tagname = 'Location' then p.value end) Location, 
    max(case when t.tagname = 'Weapon' then p.value end) Weapon 
from triples p 
left join tags t 
    on p.tagid = t.id 
group by p.postid; 

См SQL Fiddle with Demo

Но если у вас есть неизвестное число столбцов, то вам нужно использовать подготовленное заявление для создания динамического SQL:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(CASE WHEN TagName = ''', 
     TagName, 
     ''' THEN p.value END) AS `', 
     TagName, '`' 
    ) 
) INTO @sql 
FROM tags; 


SET @sql 
    = CONCAT('SELECT p.postid, ', @sql, ' 
      from triples p 
      left join tags t 
      on p.tagid = t.id 
      group by p.postid'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

См SQL Fiddle with Demo.

И даст результат:

| POSTID | INCIDENT |  LOCATION | WEAPON | 
---------------------------------------------- 
|  1 | Murder | New Brunswick | (null) | 
|  2 | Theft |  (null) | Gun | 
+0

Спасибо большое синие ноги – Swakesh

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