0

我正在为我制作的招聘网站编写报告系统。到目前为止,我已经设法获得下面的函数来完成给定时间段内的总工作量,以天、几周、几个月或几年为单位

我想做的是浏览同一时期的所有工作申请。工作申请存储在另一个名为 job_application 的表中,并包含 job_application_id、job_id 和 date_added 字段

有没有办法可以在同一个查询中提取这些数据?SQL 开始让我大吃一惊,所以任何帮助都将不胜感激!

public function getJobReport($data = array()) {
    $sql = "SELECT MIN(tmp.date_added) AS date_start, MAX(tmp.date_added) AS date_end, COUNT(tmp.job_id) AS `jobs` FROM (SELECT j.job_id, j.date_added FROM `" . DB_PREFIX . "job` j WHERE 1"; 

    if (isset($data['date_start']) && $data['date_start']) {
        $sql .= " AND DATE(j.date_added) >= '" . $this->db->escape($data['date_start']) . "'";
    }

    if (isset($data['date_end']) && $data['date_end']) {
        $sql .= " AND DATE(j.date_added) <= '" . $this->db->escape($data['date_end']) . "'";
    }

    $sql .= " GROUP BY j.job_id) tmp";

    if (isset($data['group'])) {
        $group = $data['group'];
    } else {
        $group = 'week';
    }

    switch($group) {
        case 'day';
            $sql .= " GROUP BY DAY(tmp.date_added)";
            break;
        default:
        case 'week':
            $sql .= " GROUP BY WEEK(tmp.date_added)";
            break;  
        case 'month':
            $sql .= " GROUP BY MONTH(tmp.date_added)";
            break;
        case 'year':
            $sql .= " GROUP BY YEAR(tmp.date_added)";
            break;                                  
    }

    if (isset($data['start']) || isset($data['limit'])) {
        if ($data['start'] < 0) {
            $data['start'] = 0;
        }           

        if ($data['limit'] < 1) {
            $data['limit'] = 20;
        }   

        $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
    }   

    $query = $this->db->query($sql);

    return $query->rows;        
}
4

1 回答 1

1

我不明白为什么这里需要子查询...此查询使用左连接并选择您输入的开始和结束日期作为列,然后选择 GROUP(因此将只有一个结果行)。我对您的标识符的细节略加了一些,以使其更具可读性。

...
$date_resolution_function = "DAY"; // set via a switch similar to yours
...
SELECT 
  $date_resolution_function(apps.date_added), 
  count(jobs.id) as numb_jobs, 
  count(apps.id) as num_apps
FROM 
  jobs JOIN job_application as apps ON jobs.id = apps.job_id
WHERE apps.date_added BETWEEN $start_date AND $end_date
GROUP BY $date_resolution_function(apps.date_added)

编辑:请注意,此技术需要设置您的开始和结束日期......但我强烈建议您无论如何定义合理的默认值。如果您希望默认值较宽,请使用 epoch 和 +100 年后的时间,或其他内容……但也许像“本季度”这样的内容更适合您的客户。

编辑 2(添加日期解析):重要的是要意识到,通过这种查询,您只能在任何一个工作或应用程序上获得准确的日期选择,而另一个将是“全部”。我选择了我认为更明智的选择,在申请日期选择并包括所有职位,无论它们何时发布(如果他们在指定期间提交了申请)。如果您想要其他方式(仅显示在此期间发布的工作),您可以更改传递给日期函数的列,并使 JOIN 成为 LEFT 连接...但请记住,应用程序数量的数据工作将持续整个时期,而不仅仅是发布工作的日期/周。

于 2012-07-05T16:29:23.933 回答