2009-08-14 161 views
0

我正在開發用戶事件的只讀每週日曆視圖。 列是星期幾(mon> sun) 行是時隙(8:00> 9:00,9:00> 10:00 ...從8AM到7PM)在mysql/php中生成每週日曆

問題:什麼是最好的辦法來生成該用戶日曆:

選項1:純SQL 我甚至不知道這是否可能,但我會發現它超級優雅:有MySQL生成一個表7列(日)和11行(時隙)並對每個時隙進行子查詢,檢查是否爲該時隙/用戶預訂了會議。

選項2:php/mysql 有mysql只是檢索預定/會議的會議,並與php生成的日曆交叉。

選項1是否可能?如果是這樣,是否資源密集?

謝謝 亞歷山大

UPDATE:查詢建議

這裏是「選項2」查詢我使用來獲取預訂的事件(教訓在這種情況下:用戶是一名教師)。

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))) ; 

我對查詢的建議非常感興趣,會使選項1工作!

+0

如果您需要查詢的suggetions,添加desc表,我(我們)會發布一些。 – 2009-08-15 11:58:33

+0

只是相應地更新了問題。謝謝。 – pixeline 2009-08-15 14:17:38

回答

2

試圖將日曆描述爲SQL表格聽起來不太合適。當然可以執行一個查詢,該查詢將生成一個包含7列和11行的表,但那麼您將如何處理生成的表?您仍然必須使用PHP進行渲染。

因此,首先假設PHP正在渲染一個日曆,並取消SQL預先生成一個(以及非常特定的一個!)的額外工作。通過這種方式,您可以使用單個SQL查詢來檢索一次可見的所有事件,然後在繪製日曆時將它們放在日曆中。

0

我做了這樣的事情,我認爲有7列和11行的表是一個非常糟糕的解決方案 - 可能但不好。

只需一張表,您可以在其中存儲所有「事件」,然後使用php進行渲染。您的日曆更具靈活性(想象一下,您希望增加一天中的更多時間,或者可以使用半小時的時間,如果您將它設置得很好,這只是配置設置)。

如果你仍然選擇選項1: 我不認爲這是非常耗費資源,我認爲你可能能夠緩存這些東西,所以它不會很難。

+1

我認爲當他說「mysql生成表」時,OP會提供一個SELECT QUERY結果集。所以,如果他放了另一個時隙,查詢會自動添加更多的行。確實是 – 2009-08-14 14:11:59

+0

。我的問題不是關於數據庫設計,而是關於一個選擇查詢,它將返回每週日曆完成,時間充滿了預訂的事件,一個數據結果集,我只需要在一個簡單的循環中用php來解析呈現html表格。 – pixeline 2009-08-15 08:56:49

0

我猜,但我想你可以做選項1,如果你創建一個表的時間。這將簡化很多查詢。生成日曆頁面的PHP代碼將非常簡單:您只需迭代結果集即可。 而且,爲了獲得良好的表現,你應該創建適當的索引和關鍵(我不能提前給你提供)。

編輯補充建議: @pixeline:既然你沒有添加表格佈局,這是一個在黑暗中拍攝,BU我覺得只是改變了INNER JOIN s到LEFT OUTER JOIN你做到這一點:

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並非一天中的所有時間,您可以與他們創建一個表格(如timeslot)並將其作爲第一個表格,並將時間表作爲LEFT OUTER JOINCROSS JOIN。和其他人一樣LEFT OUTER JOIN如上。

+0

事實上,事件存儲在一個表格中,時間片段存儲在另一個表格中。我得到了經典的「獲取該用戶的所有事件的那一週」查詢罰款。我發現循環遍歷每週的時間段,並發現匹配這些結果相當複雜,這就是爲什麼我認爲也許一個聰明的MySQL查詢可能只是返回我的日曆,哪些PHP只需要循環呈現表。 – pixeline 2009-08-15 08:49:56