Php 从关系数据库中选择日期

Php 从关系数据库中选择日期,php,sqlite,Php,Sqlite,我正在创建一个rollcall类型的页面 我有一个看似复杂的问题,可能不是事实,我可能在这个数据库里想得太多了 以下是我的结构: rollcall_teammates: Lists all my users ------------------------------------- | uniqueID | Name | LineID | Active | ------------------------------------- | 1 | Bob | 1 |

我正在创建一个rollcall类型的页面

我有一个看似复杂的问题,可能不是事实,我可能在这个数据库里想得太多了

以下是我的结构:

rollcall_teammates: Lists all my users ------------------------------------- | uniqueID | Name | LineID | Active | ------------------------------------- | 1 | Bob | 1 | 1 | ------------------------------------- | 2 | Sal | 2 | 1 | ------------------------------------- rc_teammates_days: The actual attendance of the users, the UserID is the uniqueID of my rollcall_teammates table. -------------------------------------------------------------------------------------- | uniqueID | UserID | TimeIn | TimeOut | Timestamp | hadLunch | Complete | Status | -------------------------------------------------------------------------------------- | 1 | 1 | 7:30AM | 4:00PM | 08/26/2016 | 1 | 0 | Attended | -------------------------------------------------------------------------------------- | 2 | 2 | 7:30AM | 4:00PM | 08/26/2016 | 1 | 0 | Attended | -------------------------------------------------------------------------------------- rc_teammates_jobs: Jobs are not added for every single day, only when changed. The UserID is based off of rollcall_teammates aswell. ----------------------------------------------- | uniqueID | UserID | Job | Timestamp | ----------------------------------------------- | 1 | 1 | Technician | 08/26/2016 | ----------------------------------------------- | 1 | 2 | Technician | 08/26/2016 | ----------------------------------------------- 我的问题是,对于输入的任何一天,我都需要一个当天活跃的作业计数

我用当前日期成功地做到了这一点,因为它始终是输入到作业表中的最后一个作业

在查看过去的日期时,这显然是不正确的

因此,我需要做的是从作业数据库中获取最接近的记录日期,即输入日期当天或之前的日期

这背后的逻辑,只是想一想,让我困惑。因此,如果能提供一些帮助,我们将不胜感激。我目前拥有的是:

这基本上会列出一个当前活动的工作列表,只在当天有效,并且也会对它们进行统计

$sql = "SELECT uniqueID,Name from rollcall_teammates WHERE $searchLines AND Active=1;";
$ret = $db->query($sql);

$jobsToday = array();
while($row = $ret->fetchArray(SQLITE3_ASSOC) ){

    $attend = $db->querySingle("SELECT Status from rc_teammates_days WHERE UserID='".$row['uniqueID']."' AND Timestamp='".date("m/d/Y")."' ORDER BY uniqueID DESC LIMIT 1;");
    if((!empty($attend)) && (strcmp($attend,"Incomplete") != 0)) {
        $job = $db->querySingle("SELECT Job from rc_teammates_jobs WHERE UserID='".$row['uniqueID']."' ORDER BY uniqueID DESC LIMIT 1;");
        if((strcmp($attend,"Attended") == 0) || (strcmp($attend,"In Late (BL)") == 0) || (strcmp($attend,"In After Lunch") == 0)) {
            array_push($jobsToday,$job);
        }
    }

}

$distinct = array_unique($jobsToday);
$counts = array_count_values($jobsToday);

echo "<ul>";
foreach($distinct as &$value) {
    echo "<li>$value (".$counts[$value].")</li>";
}
echo "</ul>";

你不能。您的数据实际上并没有跟踪这些信息。在此模式中,您没有描述活动工单和给定日期之间的关系。如果用户1在用户表中处于活动状态,但他们在给定日期的作业表中列出了3个作业,您如何知道哪个作业在哪个日期被视为活动?没有逻辑上的一致性。@如果我只需要在给定日期或之前列出最接近的工作。我得到了你想要的。。。问题是您的模式没有以任何有意义的方式描述这种关系。如果您在该日期列出了多份工作,会发生什么情况?哪一个是有效的?如果你没有,会发生什么?您定义的架构根本不支持您想问的问题。@Sherif job在给定日期或之前列出的最近的作业。最接近的是有效的。如果存在多个,它将是当天输入的最后一个,这将由uniqueID确定。将始终为用户列出一个作业。@Sherif或,我如何更改架构以更好地满足我的需要?您不能。您的数据实际上并没有跟踪这些信息。在此模式中,您没有描述活动工单和给定日期之间的关系。如果用户1在用户表中处于活动状态,但他们在给定日期的作业表中列出了3个作业,您如何知道哪个作业在哪个日期被视为活动?没有逻辑上的一致性。@如果我只需要在给定日期或之前列出最接近的工作。我得到了你想要的。。。问题是您的模式没有以任何有意义的方式描述这种关系。如果您在该日期列出了多份工作,会发生什么情况?哪一个是有效的?如果你没有,会发生什么?您定义的架构根本不支持您想问的问题。@Sherif job在给定日期或之前列出的最近的作业。最接近的是有效的。如果存在多个,它将是当天输入的最后一个,这将由uniqueID确定。将始终为用户列出一个作业。@Sherif或,我如何更改架构以更好地满足我的需要?