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;

Найти демо здесь

Другие вопросы по тегам