我正在使用MySQL构建一个允许管理和创建任务的系统。任务可以是
简化架构看起来像
Tasks ======================== | id | name | date | repeats | | 1 | Backup X | 2011-... | 0 | | 2 | Backup Y | 2011-... | 1 |
现在,假设我想对此数据集运行查询:
SELECT $N - mod(datediff(NOW(), Task.date), $N) AS datediff, Task.name
FROM tasks Task
ORDER BY datediff, Task.date;
其中N是任务的重复间隔。
如您所见,我必须按 Task.date
或datediff
排序。我真正需要的是能够对一个字段进行排序,并且datediff
依赖于任务是否重复。
在伪代码中,以下查询更合适:
SELECT
IF(Task.repeats = 1)
// Get the number of days until next repeat on a repeating event
$N - mod(datediff(NOW(), Task.date), $N) AS datediff
ELSE
// Get number of days until non-repeating task expires
datediff(NOW(), Task.date) AS datediff
所以,我正在考虑设置一个CRON作业,每隔5分钟左右用一个表格填充更新的数据。然后,我将能够在相关字段中查询此表。
我认为当任务变得更复杂时,这种方法会更好地扩展:
e.g。用户可以使用crontab语法为每个任务提供非常精确的重复间隔,这需要在应用程序代码中进行大量处理才能计算出所有任务的日期。
我很感激您对此的看法,因为我最近有一种倾向,以避免复杂的查询和存储过程。也许这有点矫枉过正?
答案 0 :(得分:0)
听起来像你应该用MySQL事件存储/运行这些事件
http://dev.mysql.com/tech-resources/articles/mysql-events.html
答案 1 :(得分:0)
在这种情况下,由于没有充分研究MySQL的控制流功能,我可能过于复杂了。
我现在正在处理的一个解决方案是
SELECT IF(Task.repeat, repeats_expression, non_repeats_expression) as date_diff;