如何使用一个查询而不是多个查询

时间:2018-07-26 06:38:16

标签: php mysql codeigniter

我有多个日期,我需要计算数据库中特定日期的记录数。我正在使用下面的代码,但是..问题是每次循环内它都会为新查询找借口。我相信有更好的方法可以做到这一点。提前致谢。

  for ($i = 0; $i <= $total_difference; $i++){
     $date = strtotime("+$i day", strtotime($start_date));
     $check_date = date("Y-m-d", $date);

     // Here i have to check the record against $check_date
    $query = $this->db->select("SELECT COUNT(task_date) as COUNT FROM 
    time_management");
    $this->db->from('time_management');
    $this->db->where('task_date',$check_date);
    $result = $this->db->get()->row_array();
    $count = $result['COUNT'];
    echo "count for $check_date is $count";

 }

2 个答案:

答案 0 :(得分:5)

您正在执行此查询:

SELECT COUNT(task_date) as COUNT 
FROM time_management 
WHERE task_date = ?

问号是日期。

您需要做的是GROUP BY task_date,然后像这样设置开始日期和结束日期:

SELECT task_date as TASKDATE,
       COUNT(task_date) as COUNT 
FROM time_management 
WHERE task_date BETWEEN ? AND ?
GROUP BY task_date

两个问号是您要计算的第一个和最后一个日期。

如vivek_23所说,在结果中包含task_date很方便,所以我添加了它。

我让您将其翻译为Codeigniter使用的特定方法,这应该很容易(我不使用它)。

如果需要零计数结果(此查询的结果中不会出现),则可以使用PHP添加它们。这比尝试强制MySQL为数据库中没有的日期提供零计数更容易。像这样:

// suppose you start with these
$start_date       = '2018-05-04';
$total_difference = 6; 

// and suppose the result of your query looks like this
$counts = ['2018-05-04' => 5,
           '2018-05-06' => 3];

// then you can insert zero count results like this:
for ($days = 0; $days <= $total_difference; $days++) {
  $date = addDaysToDate($start_date,$days);
  if (!isset($counts[$date])) $counts[$date] = 0;
}

function addDaysToDate($date,$days)
{
  $timestamp = strtotime("+$days day",strtotime($date));
  return date("Y-m-d",$timestamp);
}

请注意,我定义了一个添加天数的函数,这似乎很有用。

答案 1 :(得分:0)

因此,您有一系列日期:('2018-05-04','2018-05-05','2018-06-01'),将它们内嵌到字符串中并使用IN运算符,将按日期显示的结果:

SELECT 
    COUNT(task_date) as cnt,
    `task_date`
FROM 
    time_management
WHERE
    `task_date` IN ('2018-05-04', '2018-05-05', '2018-06-01')
GROUP BY `task_date`;

我能想到的最好的解决方案是选择循环中所有现有的记录,然后从日期数组中删除它们。剩下的将不存在,其COUNT将为零。

相关问题