繁体   English   中英

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

[英]Sorting and selecting from sql table by time zone

我有一个让我感到困惑的问题,但对某些人来说可能很容易。 它在这里:我有一个像这样的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. 必须在本地时间为1PM到5PM时选择每个用户。
  4. 如果用户的时区未定义,则必须在5PM到8PM之间进行选择。
  5. 如果用户数量在特定时间不足,例如,时区+4的用户数小于COUNT()/24 ,则可以用未定义的用户或邻居时区的用户补偿相等性。
  6. 如果在指定时间内有许多用户,则可以将其传递到下一个邻居时区。

我不需要代码,但需要逻辑。 如果有人可以帮助我,我会非常高兴。 如有任何疑问,我可以详细介绍。

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

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

  1. 在表格中添加一列“已使用的时区”(如果需要,您可以重复使用selected
  2. 在每个时区中,从尚未选择的用户中随机选择一个用户
  3. 将其分配到时区
  4. 如果某个时区没有用户,请查看该用户的相邻区域
  5. 为每个存储桶中的第n个人再次进行迭代

哦,这似乎很复杂。 似乎还需要一堆游标才能解决该问题。

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

  1. 从人口最多的可用时区开始
  2. 从时区中随机选择可用用户,并将其“已用时区”设置为时区
  3. 如果没有足够的用户,请转到以前的时区并选择多余的可用用户。
  4. 遍历时区

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM