2013-05-09 27 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. 遍历时区

这是越来越接近。您可以通过一次将用户分配到时区来进一步优化它。然后,对于未满的时区,请从其他时区选取多余的用户。

相关问题