MySQL / PHP haftalık takvim oluşturmak

3 Cevap php

i'm developing a read-only weekly calendar view of users's events. Columns are the days of the week (mon > sun) Rows are timeslots (8:00>9:00, 9:00>10:00... from 8AM up to 7PM)

Soru: ne bu kullanıcı takvim oluşturmak için en iyi yaklaşım:

Option 1: pure SQL I don't even know if that is possible, but i would find it supremelly elegant: have mysql generate a table with 7 columns (the days) and 11 rows (the timeslots) and have subqueries for each timeslot, checking if there is a meeting booked for that timeslot/user.

option 2: php/mysql have mysql just retrieve the meetings booked/user, and cross it with a php-generated calendar.

Mümkünse seçenek 1 mı? Bu ise, kaynak-yoğun?

Thank you, Alexandre

GÜNCELLEME: SORGU ÖNERİLER

İşte ben rezervasyonu olayları almak için kullanın "seçeneği 2" sorgu (bu durumda ders: kullanıcı bir öğretmen).

SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym
        FROM timetables
        INNER JOIN courses ON (courses.id=timetables.course_id)
        INNER JOIN teachers ON (teachers.id=timetables.prof_id)
        INNER JOIN locations ON (locations.id=timetables.location_id)
        WHERE ((timetables.prof_id='$id')
           AND (timetables.date >= '$starting_date')
           AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ;

Ben deçeneğini 1 iş yapacak bir sorgu önerileri için çok ilgileniyorum!

3 Cevap

SQL tablo olarak bir takvim açıklamak için çalışan iyi bir maç gibi gelmiyor. Bu 7 sütun ve 11 satırlık bir tablo oluşturur bir sorgu gerçekleştirmek için kesinlikle mümkün, ama sonra bu oluşturulan tablo ile ne yapardınız? Hala PHP kullanarak işlemek gerekiyor.

Yani PHP bir takvim oluşturma olduğu varsayımı ile başlar, ve SQL birini oluşturabilir yapma ekstra çalışma ile ortadan (ve son derece özel bir!) Önceden. Bu şekilde bir çekimde görünür olması gereken tüm olayları almak, ve sonra onu çizmek gibi takvimde üzerine koyun tek bir SQL sorgusu kullanabilirsiniz.

ben böyle bir şey yaptım, ve ben 7 sütun ve 11 satır içeren bir tablo çok kötü bir çözüm olduğunu düşünüyorum - Mümkün ama kötü.

Tüm "olayları" depolamak ve daha sonra php ile bu hale sadece bir tablo. Sen Kalender (günün saat daha eklemek, ya da bu sadece yapılandırma ayarları olacak ince inşa halinde, bu mümkün buçuk saat kullanılabilir yapmak istiyorum hayal) YOL daha esnektir.

If you still choose option 1: I dont think that it is very resource intensive, and i think you might be able to cache that stuff so it wont be to hard.

I´m guessing but I think you could do option 1 if you create a table with the timeslots. This will simplify a lot the queries. And the PHP code to generate the Calendar page will much simplier: you´ll need just to iteract over the result set. And, to get a good performance you should create apropriate index and key (i cant propose wihch ones beforehand).

EDIT TO ADD A SUGGESTION: @pixeline: Since you didnt add the table layouts, this is a shoot in the dark, bu i think just changing the INNER JOINs to LEFT OUTER JOIN you do it:

    SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym
    FROM timetables
    LEFT OUTER JOIN courses ON (courses.id=timetables.course_id)
    LEFT OUTER JOIN teachers ON (teachers.id=timetables.prof_id)
    LEFT OUTER JOIN locations ON (locations.id=timetables.location_id)
    WHERE ((timetables.prof_id='$id')
       AND (timetables.date >= '$starting_date')
       AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ;

timetables gün için tüm saatleri yok ise, (timeslot diyelim) Onlarla bir tablo oluşturun ve ilk tablo olarak koymak ve bir {[(2 gibi tarifeler koyabilirsiniz )]} veya CROSS JOIN. Ve LEFT OUTER JOIN gibi yukarıdaki diğerleri.