MySQL查询在给定时间段内报告数据

时间:2012-07-05 16:06:53

标签: php mysql

我正在为我制作的招聘网站编写报告系统。到目前为止,我已设法获得以下功能,以在几天,几个月或几年内分组的给定时间段内完成总工作

我想做的是完成同一时期的总工作申请。作业应用程序存储在另一个名为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;        
}

1 个答案:

答案 0 :(得分: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(添加日期解决方案):重要的是要意识到,通过这种查询,您只能在EITHER作业或应用程序上获得准确的日期选择,而另一个将是“全部”。我选择了我认为更明智的方法,在申请日期选择并包括所有工作,无论他们何时被发布(如果他们在指定时期内提交了申请)。如果您想要另一种方式(仅显示期间发布的作业),您可以更改传递给日期函数的列,并使JOIN成为左连接...但请记住,应用程序数量的数据为工作将在整个期间进行,而不仅仅是工作发布的DAY / WEEK。