2013-05-09 55 views
0

我有一個問題,這個問題對我來說很複雜,但對於你們中的一些人來說,這很容易。 這就是: 我有一個MySQL表像這樣按照時區從sql表中進行排序和選擇

id | username | time_zone | selected 
1  XXX   +4   1 
2  XXX   -6   0 
3  XXX   NULL  1 

等。行數可以超過一百萬。 (請注意,可能有用戶的時區未定義。) 有一個PHP腳本,它通過cron作業每小時運行一次,並從表中選擇一定數量的行。 現在是困難的部分。

  1. 從表中選擇的行數必須等於每小時。 (amount selected = COUNT()/24
  2. 每一行不得超過一天選擇一次(這就是爲什麼我在表格中添加「selected」列的原因)。
  3. 當他們的當地時間從下午1點到下午5點時,必須選擇每個用戶。
  4. 如果用戶的時區未定義,則必須從5PM至8PM選擇它們。
  5. 如果用戶數量不夠特定時間,例如具有時區+4的用戶計數小於COUNT()/24,可以用未定義的用戶或來自相鄰時區的用戶來補償相等性。
  6. 如果有許多用戶在指定的時間,他們可以傳遞到下一個鄰居時區。

我不需要代碼,但邏輯。如果有人能幫助我,我會很滿。如果有任何問題,我可以更詳細地瞭解。

+0

該腳本目前的外觀如何? – Vector 2013-05-09 18:35:46

+0

我還沒有腳本,因爲我甚至不知道從哪開始。在我剛剛從表格中選擇「COUNT()/ 24」來限制選擇的數量之前,現在我添加了時區並且卡住了。當選擇時,我選擇'selected'列爲1而不是選擇該行兩次,並在一天結束時一切都被更新爲0 – 2013-05-09 18:38:28

+0

如果您有3個或更多個時區,每個時區更多比COUNT()/ 24行?也許如果你解釋了爲什麼行應該在當地時區下午1點到5點之間選擇,有人可能會提出一個更簡單的選擇。 – Trevor 2013-05-09 19:24:48

回答

3

您有裝箱問題。 「從鄰近時區借用」使這變得更加複雜。以下是關於如何解決問題的一些想法。

這裏是想解決一個辦法:

  1. 添加列「使用時區」到表(您可以重新使用selected如果你想)
  2. 隨機選擇從一個用戶那些沒有被選中
  3. 用戶中的每個時區分配成成的時區
  4. 如果沒有用戶的時區,然後再看看周邊區域爲用戶
  5. 爲迭代再次爲每個桶中的第n個人

哦,這看起來很複雜。它似乎也需要一堆遊標來解決問題。

相反,讓我們用時區而不是用戶填充。

  1. 先從人口最多的可用時間區
  2. 隨機的時間段中選擇可用的用戶和如果沒有足夠多的用戶他們的「使用時區」設置時區
  3. ,進入上一個時區並選擇多餘的可用用戶。
  4. 遍歷時區

這是越來越接近。您可以通過一次將用戶分配到時區來進一步優化它。然後,對於未滿的時區,請從其他時區選取多餘的用戶。

相關問題