2017-11-28 1 views
4

ich eine survey_datas Tabelle haben Daten enthalten, wie dieseSQL verbinden Werte in Primärtabelle mit Kind Tabellenwerte als verschiedene Spalten in einer einzigen Zeile verbinden

survey_data_id | title 
1    | Paul 
3    | Anna 
4    | Alan 

eine andere Tabelle project_playlist_indexes der Daten ist wie diese

enthalten
survey_id |survey_data_id | favorite 
1   | 1    | 22.10 
2   | 1    | 24.00 
3   | 3    | 12.00 

ich mag die survey_datas Tabelle mit der project_playlist_indexes Tabelle verbinden, so dass in der project_playlist_indexes Tabelle enthaltenen Werte mit gleichem survey_data_id wie survey_datas Tabelle als Favoriten time1 bekommen sollten, liebste Zeit 2, ... liebste Zeit n, das Ergebnis t ich in der Lage ist zu bekommen, wie dies

survey_data_id |title | favorite_time1 | favorite_time2 
      1 | paul | 22.10   |24.00 
      3 | anna | 12.00   | null 
      4 | alan | null   | null 

Derzeit bin ich die Abfrage

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 

aber die bevorzugten Werte in einem einzigen Feld bekommen ich es in verschiedenen Spalten sein will. Wie kann ich das tun

Antwort

1

Sie können es tun, indem Sie eine dynamische SQL-Abfrage ausführen. Was ich getan habe, ist zunächst eine Zeilennummer basierend auf der Spalte survey_data_id gegeben. Wählen Sie dann jede Zeilennummer als jede Spaltengruppe mit survey_data_id aus. Ich weiß nicht, wie effizient der Code ist.

Abfrage

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; 

Find a demo here

Verwandte Themen