2016-09-01 123 views
2

我想将行转换为列(星期几名称),但每行只有一个条目,而其余列是空的(对于教师和时间段)。将行转换为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”,并有“名”为CONCAT。我认为这很容易,因为你没有列,你真的不需要,这不检查每行的“如果”。

+0

感谢您的回复,但我没有显示weekDayName,但任何与老师在给定的插槽相关的东西,我创建一个老师的时间表,我把周日作为列,因为它是固定的,其余东西正在改变,所以请你能帮助我编写一个查询时间表,相关表在结构表中作为外键提及,谢谢 – sefburhan