2013-12-24 3 views
0

У меня есть уроки, хранящиеся в таблице. Тезисы уроки повторяются каждую неделю, так что я только хранить индекс день (0: воскресенье, 1: понедельник, и т.д. ...)MySQL Retrieve Еженедельные события, хранящиеся в DAYOFWEEK

Вот пример: (Моя настоящая таблица имеет гораздо больше столбцов)

ID NAME  DAY 
1 English 1 
2 Math  2 
3 Physic 3 

Если я хочу, чтобы получить уроки сегодня, я могу смотреть на уроки, где DAY = DAYOFWEEK(NOW())

Теперь я хочу, чтобы получить все уроки от одного дня к другому, и этот диапазон может быть больше, чем на неделю. И мне нужно получить дату, соответствующую тому, что произошло в уроке.

Если я смотрю на уроки от 2013-12-23 до 2013-12-31 Я ожидал что-то подобное:

ID NAME  DATE 
1 English 2013-12-23 
2 Math  2013-12-24 
3 Physic 2013-12-25 
1 English 2013-12-30 
2 Math  2013-12-31 

Моя первоначальная идея состояла в том, чтобы присоединиться к виртуальной таблице, которая содержит все даты из диапазон до моей таблицы уроков на LESSONS.DAY = DAYOFWEEK(DATES.DATE), но я не понял, как это сделать.

Возможно ли это сделать в запросе mysql? Я использую его в PHP-программе.

Я уже много раз искал в Интернете, но я не мог найти ничего подобного.

Заранее спасибо.

PS: Английский - это не мой родной язык.

Редактировать Вот мой фактический запрос. Я могу получить уроки, которые находятся в пределах диапазона, но они уникальны и не имеют соответствующей даты.

SELECT * FROM Lessons 
WHERE Day_Lesson > DAYOFWEEK(:datefrom) AND Day_Lesson < DAYOFWEEK(:dateto) 
+0

Что произойдет, если изменения в расписании? –

+1

Вы пробовали «между» ?? /// – cipherux

+0

@cipherux Это не сработает, потому что у него нет дат в таблице. – Barmar

ответ

0

Использование PHP для создания виртуальной таблицы, содержащей все дни в интервале времени, используя UNION.

$begin = new DateTime('2013-12-23'); 
$end = new DateTime('2014-01-01'); // DatePeriod is exclusive of end date 
$interval = new DateInterval('P1D'); 
$period = new DatePeriod($begin, $interval, $end); 

$sqlarray = array(); 
foreach ($period as $date) { 
    $sqlarray[] = 'select "' . $date->format('Y-m-d') . '" AS date'; 
} 
$union = implode(' UNION ', $sqlarray); 
$sql = "SELECT * 
     FROM ($union) AS d 
     JOIN Lessons AS l 
     ON DAYOFWEEK(d.date) = l.day"; 
+0

Спасибо! Он работает точно так, как я ожидал. – Kaktus

0

Хранимая процедура в MySQL может помочь вам:

delimiter $$ 
create procedure getMyLessonCalendar(d0 date, d1 date) 
begin 
    declare d date; 
    drop table if exists temp_dates; 
    create temporary table temp_dates (
     d date not null primary key, 
     wd int not null, 
     index idx_wd(wd) 
    ); 
    set d = d0 
    while d <= d1 do 
     insert into temp_dates 
      values (d, weekday(d)); 
     set d = dateadd(d, interval +1 day); 
    end while; 
    select 
     l.id, l.name, a.d as `date` 
    from 
     lessons as l 
     inner join temp_dates as a on l.weekday = a.wd; 
end $$ 
delimiter ; 
+0

Я предпочитаю решение @ Barmar, так как оно не создает временную таблицу. Может быть, это более эффективно? Но я не знаю, как это проверить. – Kaktus

+0

Я забыл обновить переменную 'd' ... Просто исправил ее. – Barranka

+0

@Kaktus С решением Bamar PHP - это тот, который выполняет всю работу. С моим решением MySQL выполняет всю работу. Это всего лишь вопрос предпочтения ... оба могут вам помочь, но вам решать, какой подход лучше работает. – Barranka

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