2017-03-09 23 views
2

は、学生、それらが割り当てられているコホートのリストを作成し、次のクエリ、考える:のMySQL:ピボットのようなクエリ結果

SELECT mdl_user.lastname, mdl_user.firstname, mdl_cohort.name 
FROM mdl_cohort 
INNER JOIN mdl_cohort_members ON mdl_cohort_members.cohortid = mdl_cohort.id 
INNER JOIN mdl_user ON mdl_cohort_members.userid = mdl_user.id 
ORDER BY mdl_user.lastname, mdl_cohort.name 

をONCE各コホート名を示して結果を生成することが可能です、好ましくは列名として、そのコホートに割り当てられた各生徒がその下にリストされていますか?このような何か:ここにいくつかの本当に素晴らしい例があります

Engineering Cohort Administrative Cohort IT Cohort 
------------------ --------------------- --------- 
John Doe    Jane Smith    Jane Doe 
Jane Smith   John Smith    John Doe 
Dan Jones    Dana Jones    Dana Jones 

答えて

1

これはスクリプト化することができます。..純粋なSQLベースのアプローチはかなり醜いです。 (各々のための1つからインクリメントされたカウンタとの)テーブルに次のアプローチロードの結果は、その後、一緒に接合されています。最後の組合は、コホートが残っていないことを保証するために完全な外部結合をエミュレートします。

set @admin:=0; 
set @eng:=0; 
set @it:=0; 

drop table if exists administrative; 
create table administrative as 
     select (@admin := @admin + 1) as counter 
      , cohort 
     from ( select concat(mdl_user.firstname, ' ', mdl_user.lastname) as cohort 
        from mdl_cohort 
       inner join mdl_cohort_members on (mdl_cohort_members.cohortid = mdl_cohort.id) 
       inner join mdl_user on (mdl_cohort_members.userid = mdl_user.id) 
        where mdl_cohort.name='Administrative Cohort' 
       order by mdl_user.lastname, mdl_user.firstname) as admin; 

drop table if exists engineering; 
create table engineering as 
     select (@eng := @eng + 1) as counter 
      , cohort 
     from ( select concat(mdl_user.firstname, ' ', mdl_user.lastname) as cohort 
        from mdl_cohort 
      inner join mdl_cohort_members on (mdl_cohort_members.cohortid = mdl_cohort.id) 
      inner join mdl_user on (mdl_cohort_members.userid = mdl_user.id) 
        where mdl_cohort.name='Engineering Cohort' 
       order by mdl_user.lastname, mdl_user.firstname) as eng; 

drop table if exists it; 
create table it as 
     select (@it := @it + 1) as counter 
      , cohort 
     from ( select concat(mdl_user.firstname, ' ', mdl_user.lastname) as cohort 
        from mdl_cohort 
       inner join mdl_cohort_members on (mdl_cohort_members.cohortid = mdl_cohort.id) 
       inner join mdl_user on (mdl_cohort_members.userid = mdl_user.id) 
        where mdl_cohort.name='IT Cohort' 
       order by mdl_user.lastname, mdl_user.firstname) as it; 

select admin.cohort as `Administrative Cohorts`, 
     eng.cohort as `Engineering Cohorts`, 
     it.cohort as `IT Cohorts` 
    from administrative admin 
left join engineering eng on(eng.counter=admin.counter) 
left join it on (it.counter=admin.counter) 
union 
select ''   as `Administrative Cohorts`, 
     eng.cohort as `Engineering Cohorts`, 
     it.cohort as `IT Cohorts` 
    from engineering eng 
left join it on (it.counter=eng.counter) 
where not exists (select 1 
        from administrative 
        where counter=eng.counter) 
union 
select ''   as `Administrative Cohorts`, 
     ''   as `Engineering Cohorts`, 
     it.cohort as `IT Cohorts` 
    from it 
where not exists (select 1 
        from administrative 
        where counter=it.counter) 
    and not exists (select 1 
        from engineering 
        where counter=it.counter); 
+0

これは崇高です。私は劇中の他の20(!)のコホートを包含するようにして展開する必要がありますが、それは動作します。ありがとう! – Chris

1

が、これは役立つかもしれないと思った: Pivot table basics: rows to columns

+0

感謝。私はGROUP_CONCATが私が探しているものを潜在的に得ることができる場所を見ます。今では、連結したコホートの名前の下に生徒を表示させる方法がわかりません。 – Chris

+0

私はあなたの代わりにビューからビューとピボットを使用することができれば、それは良いだろうというあなたに言及するのを忘れてしまいました。私が見たすべての例からは、それらの大半は、単一のテーブルからされていると合流使用していません。あなたは、ビューを作成し、それを使用したり、あなたの要件とどのくらいあなたの周りのデータが必要に依存して、後であなたが破壊することができ、一時テーブルをロードするためのいくつかのコードを書くことができます。 –

+0

ありがとうございます。私はそのアプローチも取り組んでいます。 – Chris

関連する問題