2013-05-08 19 views
0

我已經看了很多圍繞此主題的stackoverflow答案,但它們似乎都是從不同的方向來的。這就是我想要做的事情,在這個階段,我比寫特定的代碼更容易理解它的方法。使用MySQL和PHP將性能時間與受衆可用性相匹配

該任務是顯示用戶可以基於其現有承諾看到的展示,無論這些承諾是不可用還是已經看到別的東西。

表A中包含的用戶不可用的起始端&時間列表

表B中包含的用戶的預訂現有的開始&結束時間的列表。

表C包含所有節目的開始&結束時間的列表。

要添加更多的細節,我使用FullCalendar議程查看來顯示用戶的承諾。在我想要顯示的節目中,他們可以看到。顯示不可用性和現有承諾的代碼已經編寫完成,但我現在不知道如何查找表C中與表A & B中的條目不衝突的表單。

任何想法?

回答

0

我的解決方案是針對PHP的,但我確信隱藏在SQL存儲過程中有更好的解決方案或其他東西。

如果你使用Unix時間工作,你可以通過比較開始和結束時間只是測試開放式插槽:

  1. 動態創建一個用戶可用插槽的列表。
  2. 迭代通過列表和比較表C.東西每個展示一個開放的槽狀

    if (
         (showtime['begin'] >> opentime['begin']) && 
         (showtime['end'] << opentime['end']) 
        ) return true; 
    
  3. 如果你找到一個匹配,把它打印出來。

編輯:

思考了一下,我想出了一個可能更好的解決方案後。沒有辦法擺脫而不是比較一切項目。所以訣竅在於不是一次完成所有處理,而是在應用程序的整個生命週期中分發它:

  • 編輯數據庫並向所有表添加持續時間字段。
  • 製作一個存儲過程(mySQL可以做到這一點,對吧?),它會觸發表更新。此過程計算持續時間並填充該元組的對應字段。
  • 現在你選擇所有,其持續時間= <一些開放插槽

這樣,所有繁重的工作在SQL,而不是在做PHP的元組,因此它可能會更快。

+0

此外,這個問題可能應該標記爲'家庭作業' – getack 2013-05-08 12:38:39

+0

家庭作業?我46歲! – PeteSE4 2013-05-08 12:55:35

+1

我確實考慮過這種方法 - 但是表C中的節目數量可能會是一個很大的數字,所以遍歷而不是用select語句做一些聰明的事情似乎效率很低。 – PeteSE4 2013-05-08 12:57:22