2016-09-01 8 views
2

行を列に変換したい(曜日の名前)が、行ごとに1つのエントリしかなく、残りの列は空です(先生とタイムスロット用)。MySQLの列に行を変換する

表構造:

table structure

フォロークエリの出力:

query result

と私のクエリは次のとおりです。

SELECT 
/* Employee section */ 
CONCAT(emp.first_name, " ",emp.middle_name,"", emp.last_name) as  employeeFullName, 

/* Timetable Entry section */ 
CONCAT(ct.start_time," - ",ct.end_time) as Slots, 

if(wd.name='Monday',CONCAT(sb.name," - ",bt.name),null) Monday, 
if(wd.name='Tuesday',CONCAT(sb.name," - ",bt.name),null) Tuesday, 
if(wd.name='Wednesday',CONCAT(sb.name," - ",bt.name),null) Wednesday, 
if(wd.name='Thurseday',CONCAT(sb.name," - ",bt.name),null) Thurseday, 
if(wd.name='Friday',CONCAT(sb.name," - ",bt.name),null) Friday, 
if(wd.name='Saturday',CONCAT(sb.name," - ",bt.name),null) Saturday, 
if(wd.name='Sunday',CONCAT(sb.name," - ",bt.name),null) Sunday 

FROM `timetable_entries` te 

left Join `weekdays` wd ON te.weekday_id=wd.id 
left Join `employees` emp ON te.employee_id=emp.id 
left Join `class_timings` ct ON te.class_timing_id=ct.id 
left Join `batches` bt ON te.batch_id=bt.id 
left Join `subject` sb ON te.subject_id=sb.id 

WHERE te.employee_id is not null 
Group By te.class_timing_id,te.employee_id 
+5

私は「列を列に変換する」のがとても好きです。あなたが望むものではありません。これは、リレーショナルデータベースの原則と矛盾します。 –

+0

返信ありがとう、混乱のために申し訳ありませんが、私は問題が画像とクエリから明らかだと思います! – sefburhan

+0

私は完全に詳述する時間がありませんでしたが、あなたはクラスのタイミングから質問を始め、08:00、09:00などで始まるすべてのクラスを取り出す必要があると思います。クラスの詳細を得ることができます。 –

答えて

1

私はあなたが全体を変更すべきだと思います考え。

 SELECT 
    /* Employee section */ 
    CONCAT(emp.first_name, " ",emp.middle_name,"", emp.last_name) as  employeeFullName, 

    /* Timetable Entry section */ 
    CONCAT(ct.start_time," - ",ct.end_time) as Slots, 
wd.name as weekDayName, 
CONCAT(sb.name," - ",bt.name) as name 

ここで、「weekDayName」として各日にアクセスでき、「名前」を連結として使用できます。私はあなたが実際に必要としない列を持っていないので、これは簡単だと思うし、これは各行の "if"をチェックしません。

+0

返信ありがとうございますが、weekDayNameを表示していませんが、指定されたスロットに教師に関連するものがあります。教師用のタイムテーブルを作成しています。固定されており、残りの部分が変化しています。タイムテーブルのクエリを書くために、関連するテーブルは外部キーとして構造テーブルに記載されています、ありがとう – sefburhan