SQL 联接以将主 table 中的值与子 table 值联接为一行中的不同列
SQL join to join values in primary table with child table values as different columns in a single row
我有一个 survey_datas table 包含这样的数据
survey_data_id | title
1 | Paul
3 | Anna
4 | Alan
另一个table project_playlist_indexes包含这样的数据
survey_id |survey_data_id | favorite
1 | 1 | 22.10
2 | 1 | 24.00
3 | 3 | 12.00
我想加入 survey_datas table 和 project_playlist_indexes table 以便 project_playlist_indexes table 中包含的值具有相同的值survey_data_id as survey_datas table 应该得到 as favorite time1 , favorite time 2, ... favorite time n , 结果 table 我喜欢得到的是这样
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
但最喜欢的值是在单个字段中,我希望它在不同的列中。我该怎么做
您可以通过执行动态 sql 查询来完成。我所做的是,首先根据 survey_data_id
列给出一个行号。然后通过survey_data_id
选择每个行号项作为每个列组。不知道代码效率如何。
查询
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;
我有一个 survey_datas table 包含这样的数据
survey_data_id | title
1 | Paul
3 | Anna
4 | Alan
另一个table project_playlist_indexes包含这样的数据
survey_id |survey_data_id | favorite
1 | 1 | 22.10
2 | 1 | 24.00
3 | 3 | 12.00
我想加入 survey_datas table 和 project_playlist_indexes table 以便 project_playlist_indexes table 中包含的值具有相同的值survey_data_id as survey_datas table 应该得到 as favorite time1 , favorite time 2, ... favorite time n , 结果 table 我喜欢得到的是这样
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
但最喜欢的值是在单个字段中,我希望它在不同的列中。我该怎么做
您可以通过执行动态 sql 查询来完成。我所做的是,首先根据 survey_data_id
列给出一个行号。然后通过survey_data_id
选择每个行号项作为每个列组。不知道代码效率如何。
查询
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;