2017-01-23 3 views
1

В настоящее время я разрабатываю программу тайм-таблицы с использованием рамки Codeigniter в PHP и MySQL. У меня schedule таблицу, имеющие следующие данные:Создать представление таблицы времени из данных графика

+-------------+--------------+-----------+--------+ 
| Schedule ID | Subject Name | Day  | Period | 
+-------------+--------------+-----------+--------+ 
| 1   | Biology  | Monday | 1  | 
| 2   | Biology  | Wednesday | 2  | 
| 3   | Biology  | Friday | 3  | 
| 4   | Physics  | Tuesday | 8  | 
| 5   | Physics  | Thursday | 6  | 
| 6   | Math   | Monday | 7  | 
+-------------+--------------+-----------+--------+ 

можно взять каждую строку таблицы schedule в виде массива. Я хочу, чтобы создать временную таблицу в следующем виде (используя HTML таблицу):

+---+---------+---------+-----------+----------+---------+ 
| # | Monday | Tuesday | Wednesday | Thursday | Friday | 
+---+---------+---------+-----------+----------+---------+ 
| 1 | Biology |   |   |   |   | 
+---+---------+---------+-----------+----------+---------+ 
| 2 |   |   | Biology |   |   | 
+---+---------+---------+-----------+----------+---------+ 
| 3 |   |   |   |   | Biology | 
+---+---------+---------+-----------+----------+---------+ 
| 4 |   |   |   |   |   | 
+---+---------+---------+-----------+----------+---------+ 
| 5 |   |   |   |   |   | 
+---+---------+---------+-----------+----------+---------+ 
| 6 |   |   |   | Physics |   | 
+---+---------+---------+-----------+----------+---------+ 
| 7 | Math |   |   |   |   | 
+---+---------+---------+-----------+----------+---------+ 
| 8 |   | Physics |   |   |   | 
+---+---------+---------+-----------+----------+---------+ 

Я был бы признателен за любую помощь, о создании таблицы в таком формате.

+0

Можете ли вы поделиться тем, что вы делали до сих пор? Любой PHP-код будет полезен для нас. –

ответ

1

Попробуйте это:

SELECT ScheduleID, 
     MAX(CASE WHEN Day = 'Monday' THEN SubjectName END) AS Monday, 
     MAX(CASE WHEN Day = 'Tuesday' THEN SubjectName END) AS Tuesday, 
     MAX(CASE WHEN Day = 'Wednesday' THEN SubjectName END) AS Wednesday, 
     MAX(CASE WHEN Day = 'Thursday' THEN SubjectName END) AS Thursday, 
     MAX(CASE WHEN Day = 'Friday' THEN SubjectName END) AS Friday 
FROM mytable 
GROUP BY ScheduleID 

Demo here

Edit:

Вы, кажется, хотите сгруппировать по Period вместо ScheduleID. Вы можете создать таблицу в линию, которая содержит все возможные Period значения, или использовать справочную таблицу, если у вас уже есть:

SELECT t1.Period, 
     MAX(CASE WHEN Day = 'Monday' THEN SubjectName END) AS Monday, 
     MAX(CASE WHEN Day = 'Tuesday' THEN SubjectName END) AS Tuesday, 
     MAX(CASE WHEN Day = 'Wednesday' THEN SubjectName END) AS Wednesday, 
     MAX(CASE WHEN Day = 'Thursday' THEN SubjectName END) AS Thursday, 
     MAX(CASE WHEN Day = 'Friday' THEN SubjectName END) AS Friday 
FROM (SELECT 1 AS Period UNION ALL 
     SELECT 2 UNION ALL 
     SELECT 3 UNION ALL 
     SELECT 4 UNION ALL 
     SELECT 5 UNION ALL 
     SELECT 6 UNION ALL 
     SELECT 7 UNION ALL 
     SELECT 8) AS t1 
LEFT JOIN mytable AS t2 ON t1.Period = t2.Period 
GROUP BY t1.Period 

Demo here

+0

ничего себе! Я не знал, что могу это сделать с помощью SQL. Спасибо – danishjo

+0

@Giorgos Мне очень понравился ваш подход, но, пожалуйста, проверьте 4-й и 5-й ряды. Поскольку вы не проверяете столбец * period *, ваш результат отличается от ожидаемого danishjo. –

+0

@ TuğcaEker? Да, вы правы. Я заметил этот вопрос только после того, как я опубликовал свой ответ. Он должен немного подправить запрос, чтобы достичь желаемого результата. –

Смежные вопросы