按时区从sql表中排序和选择

时间:2013-05-09 18:26:20

标签: php mysql sql database database-design

我有一个问题,这对我来说很复杂,但对于你们中的一些人来说,这很容易。 这里是: 我有一个像这样的MySQL表

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. 每行不得每天选择多次(这就是为什么我在表格中添加了“已选中”列。)
  3. 当地时间为下午1点至下午5点时,必须选择每位用户。
  4. 如果用户的时区未定义,则必须从下午5点到晚上8点选择。
  5. 如果特定时间内的用户数量不足,例如时区+4的用户计数小于COUNT()/24,可以使用未定义的用户或来自邻居时区的用户来补偿相等性。
  6. 如果指定时间内有多个用户,则可以将其传递到下一个邻居时区。
  7. 我不需要代码而是逻辑。如果有人可以提供帮助,我会非常满意。如果有任何问题,我可以详细介绍。

1 个答案:

答案 0 :(得分:3)

你有垃圾箱包装问题。 “借用邻近的时区”使这变得更加复杂。以下是关于如何解决问题的一些想法。

这是考虑解决方案的一种方法:

  1. 在表格中添加“使用过的时区”栏目(如果需要,可以重复使用selected
  2. 从未被选中的用户中随机选择每个时区中的一个用户
  3. 将其分配到时区
  4. 如果时区没有用户,请查看用户的相邻区域
  5. 再次为每个桶中的第n个人迭代
  6. 哦,这看起来很复杂。它似乎也需要一堆游标才能解决问题。

    相反,让我们按时区而不是用户填充。

    1. 从人口最多的可用时区开始
    2. 从时区中随机选择可用用户,并将其“使用时区”设置为时区
    3. 如果没有足够的用户,请转到上一个时区并选择多余的可用用户。
    4. 迭代时区
    5. 这已经接近了。您可以通过一次性将用户分配到时区来进一步优化它。然后,对于未满的时区,请从其他时区中挑选多余的用户。