2013-07-12 7 views
1

У меня есть программа для системы посещаемости студента и записи сохранить на тузда таблице, как показано ниже, если присутствует, то 1 и если отсутствует, то 0Обновления MySQL одна таблицы из другой таблицы на основе даты

Таблица -> посещаемость

uid date  status App 
1 01/07/2013 1 
1 01/07/2013 1 
1 01/07/2013 1 
1 01/07/2013 0 
1 01/07/2013 0 
1 02/07/2013 1 
1 02/07/2013 0 
1 02/07/2013 1 
1 02/07/2013 1 
1 02/07/2013 1 
1 03/07/2013 0 
1 03/07/2013 0 
1 03/07/2013 1 
1 03/07/2013 1 
1 03/07/2013 1 
1 04/07/2013 0 
1 04/07/2013 1 
1 04/07/2013 1 
1 04/07/2013 1 
1 04/07/2013 1 

И я также есть таблица где студент представить свои заявки отпуска, как ниже

Таблица -> применение

id uid from   to   status 
1 1 04/07/2013 07/07/2013 approved 
2 1 11/07/2013 12/07/2013 rejected 

Я хочу, чтобы, если статус установлен на одобренный, диапазон дат, указанный в заявке от 4 июля до 7 июля, будет искать в таблице «посещаемость» и независимо от того, какие даты будут найдены с 0-статусом, он добавит 1 в «приложение», и игнорируйте даты, по которым не проводилось посещение.

+0

Что ваш вопрос? – Arthur

+0

Возможно, вы хотите установить статус на 2 IF status равен 0, поэтому вы можете отменить заявку и по-прежнему сохранять нормальную посещаемость. Ie 0-off, 1-in, 2-hol – Waygood

+1

Ваши даты * * хранятся с использованием типа данных 'date', правильно? – Strawberry

ответ

3
UPDATE attendance d 
    JOIN application p 
    ON d.uid = p.uid 
    AND d.date BETWEEN p.from AND p.to 
    AND p.status = 'approved' 
SET d.app = 1 
WHERE d.status = 0 
+0

Я думаю, что это точный код, который я хочу отличную работу !!!!!! –

3
UPDATE attendance d 
    JOIN application p 
    ON d.uid = p.uid 
    AND d.date BETWEEN p.from AND p.to 
SET d.status = 1 
WHERE p.status = 'approved' 
+0

Спасибо, что работает для меня –

+0

Это должно быть D.App вместо d.status, а также where where с d.status = 0 –

0

Это должно делать то, что вы хотите:

UPDATE attendance a 
    Set a.app=1 
    WHERE a.uid IN 
     (select z.uid 
      FROM application z 
      WHERE z.status='approved' 
       AND a.date BETWEEN z.from and z.to); 
+0

@Waygood, я понимаю, почему вы думаете, что MySQL будет выполнять соответствие уровня строки на основе коррелированных подзапрос. См. Описание полу-объединений здесь: http://dev.mysql.com/doc/refman/5.6/en/semi-joins.html. –

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