SQL-соединение для объединения значений в первичной таблице со значениями дочерней таблицы в виде разных столбцов в одной строке
У меня есть таблица survey_datas, содержащая данные, как это
survey_data_id | title
1 | Paul
3 | Anna
4 | Alan
Другая таблица project_playlist_indexes содержит такие данные
survey_id |survey_data_id | favorite
1 | 1 | 22.10
2 | 1 | 24.00
3 | 3 | 12.00
Я хочу объединить таблицу survey_datas с таблицей project_playlist_indexes, чтобы значения, содержащиеся в таблице project_playlist_indexes с таким же значением survey_data_id, что и в таблице survey_datas, были такими же, как любимое время1, любимое время 2, ... любимое время n, таблица результатов, которую я хотел бы получить, как это
survey_data_id |title | favorite_time1 | favorite_time2
1 | paul | 22.10 |24.00
3 | anna | 12.00 | null
4 | alan | null | null
В настоящее время я использую запрос
SELECT s.*,GROUP_CONCAT(pi.favorite) ,pi.*
FROM survey_datas s
LEFT JOIN project_playlist_indexes pi
ON pi.survey_data_id = s.survey_data_id
GROUP BY pi.survey_data_id
но любимые значения попадают в одно поле, я хочу, чтобы оно было в разных столбцах. Как я могу это сделать
1 ответ
Вы можете сделать это, выполнив динамический SQL-запрос. What I have done is, first given a row number based on the survey_data_id
колонка. Then selected each row number item as each column group by survey_data_id
, Don't know how efficient the code is.
запрос
set @query = null;
select
group_concat(distinct
concat(
'max(case when `rn` = ',
`rn`,
' then `favorite` end) as `favorite', `rn` , '`'
)
) into @query
from (
select `survey_id`, `survey_data_id`, `favorite`, (
case `survey_data_id` when @curA
then @curRow := @curRow + 1
else @curRow := 1 and @curA := `survey_data_id` end
) as `rn`
from `project_playlist_indexes` t,
(select @curRow := 0, @curA := '') r
order by `survey_data_id`, `survey_data_id`
) t;
set @query = concat('select t2.`survey_data_id`, t2.`title`,',
@query,
' from (select `survey_id`, `survey_data_id`, `favorite`, (
case `survey_data_id` when @curA
then @curRow := @curRow + 1
else @curRow := 1 and @curA := `survey_data_id` end
) as `rn`
from `project_playlist_indexes` t,
(select @curRow := 0, @curA := '''') r
order by `survey_data_id`, `survey_data_id`) t1
right join `survey_datas` t2
on t1.survey_data_id = t2.`survey_data_id`
group by t1.`survey_data_id`
order by t2.`survey_data_id`;'
);
prepare stmt from @query;
execute stmt;
deallocate prepare stmt;