安排使用模板和覆盖在PHP/MySQL中搜索

Dar*_*lor 5 php mysql scheduling date

我正在寻找一些相当复杂的搜索算法的建议/帮助.任何相关技术等的文章将非常感激.

背景

我正在构建一个应用程序,简而言之,它允许用户在任何一天设置"可用性".用户首先设置一般可用性模板,允许他们说:

Monday - AM   
Tuesday - PM  
Wednesday - All Day  
Thursday - None  
Friday - All Day
Run Code Online (Sandbox Code Playgroud)

因此,该用户通常在周一上午,周二下午等处可用.

架构:

id  
user_id  
day_of_week  (1-7)(Monday to Sunday)
availability
Run Code Online (Sandbox Code Playgroud)

然后,他们可以手动覆盖特定日期,例如:

2013-03-03 - am  
2013-03-04 - pm  
2013-03-05 - all_day
Run Code Online (Sandbox Code Playgroud)

架构:

id
user_id
date
availability
Run Code Online (Sandbox Code Playgroud)

这一切都运行良好 - 我生成了一个日历,它结合了模板和覆盖,并允许用户修改其可用性等.

问题

我现在需要允许管理员用户搜索具有特定可用性的用户.因此,管理员用户将使用日历来选择所需的日期和可用性,并点击搜索.

例如,找到我可用的用户:

2013-03-03 - pm
2013-03-04 - pm
2013-03-05 - pm
Run Code Online (Sandbox Code Playgroud)

搜索过程必须使用模板化可用性和覆盖搜索可用用户,然后返回最佳结果.理想情况下,它会返回一直可用的用户,但是如果没有单个用户可以匹配日期,我需要提供可以的用户组合.

我知道这是一个非常复杂的问题,我不是在寻找一个完整的答案,也许只是一些指导或链接到可能相关的技术等.

我试过的

目前,我有一个中途解决方案.我抓住所有可用的用户,通过他们每个人的循环,而循环中,通过所有必需的日期循环,并尽快打破僵局,用户不符合要求的日期.这显然是非常不可扩展的,它也只返回"完美匹配".

可能的解决方案

使用聚合表搜索全文

我想创建一个具有以下模式的单独表:

user_id
body
Run Code Online (Sandbox Code Playgroud)

body字段将填充用户模板天和覆盖,因此示例记录可能如下所示:

user_id: 2
body: monday_am tuesday_pm wednesday_pm thursday_am friday_allday 2013-03-03_all_day 2013-03-03_pm
Run Code Online (Sandbox Code Playgroud)

然后我会将用户搜索查询转换为类似的格式.因此,如果用户是找人谁是可利用的在2013年3月19日 - 全日和2013年3月20日 - PM,我认为转换成字符串.

首先,由于3月19日是星期二,我将其转换为星期二_allday,与20日相同.因此,我最终得到:

tuesday_allday wednesday_pm 2013-03-19_allday 2013-03-20_pm
Run Code Online (Sandbox Code Playgroud)

然后我会对我们的聚合表进行全文搜索并返回一个"加权"结果集,然后我可以循环并进一步询问.

我不确定这在实践中是如何工作的,所以这就是为什么我要问是否有任何人可以使用我可以使用的技术或相关文章.

shr*_*gon 0

好吧,这是我会做的:

  • 在用户表中创建周日、周一...周六的字段。
  • 使用pm,amboth作为这些字段中的值。
  • 您还应该为数据库中的每个字段建立索引,以便更快地查询。
  • 然后为用户/日期/子午线字段创建一个单独的表(子午线表示上午或下午)。同样,经络场值将为pmamboth
  • 您需要对php 的日期函数进行一些研究,以提取星期几,并可能对其使用 switch 语句。
  • 使用请求的日期并提取星期几并查询用户表以了解其星期几的可用性。
  • 然后使用请求的日期/经络本身并查询新的用户/日期/经络表以获取用户的个人可用日期/经络。

我认为除了提取日期请求中的星期几之外,这里不会有太多的算法。如果你正在做一个日期范围,那么你可以从算法中受益,但如果它只是一堆精心挑选的日期,那么你只需要一个一个地做。让我知道,也许我会给你一个算法。