2015-01-15 3 views
0

У меня есть запрос SQL, который генерирует следующее:Сводные строки в столбцы

col1 | col2 | col3 
===================== 
item1 | key1 | value1 
--------------------- 
item1 | key2 | value2 

Это запрос:

SELECT t1.col1, t2.col2, t2.col3 
FROM table1 t1 
JOIN table2 t2 ON t1.id = t1.table1_id 

Данные в таблице 1:

id | col1 
========= 
1 | item1 
2 | item1 

данных в table2 :

table1_id | col2 | col3 
===================== 
1   | key1 | item1 
1   | key2 | item2 
2   | key1 | item1 
2   | key2 | item2 
2   | key3 | item3 

Количество строк является динамическим, так что я мог бы также получить следующее в некоторых случаях:

col1 | col2 | col3 
===================== 
item2 | key1 | value1 
--------------------- 
item2 | key2 | value2 
--------------------- 
item2 | key3 | value3 

так, как я хочу, чтобы первый запрос, в конечном итоге, как это:

col1 | key1 | key2 
======================= 
item1 | value1 | value2 

И второй запрос будет:

col1 | key1 | key2 | key3 
============================== 
item2 | value1 | value2 | value3 

Есть ли простой способ сделать это без чрезмерного комплексообразования? Я использую MariaDB.

+0

Вы можете использовать 'CASE', но это, вероятно, будет громоздким. – potashin

+0

позволяет увидеть запрос! мы больше не собираемся писать все за вас. – DLeh

+0

Google «динамический сводный мариадб» или «динамический опорный mysql». –

ответ

0

Я думаю, что вы хотите этот вопрос:

SET SESSION group_concat_max_len = 1000000; 

SET @sql = NULL; 
SELECT 
GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(CASE WHEN t2.col2= ''', 
     t2.col2, 
     ''' THEN t2.col3 END) AS ', 
     t2.col2 
    ) 
    )INTO @sql 
FROM 
    t1 
JOIN t2 ON t1.id = t2.table1_id 
; 


SET @sql=CONCAT('SELECT t1.col1, ',@sql,' FROM 
    t1 
JOIN t2 ON t1.id = t2.table1_id'); 

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

FIDDLE

Если у вас есть различные элементы, которые вы, вероятно, хотите, чтобы группировать по пункту

FIDDLE

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