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

Php 如何使用一个查询而不是多个查询,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有多个日期,我需要计算数据库中特定日期的记录数。我正在使用下面的代码,该代码正在工作,但。。问题是每次在循环中都会有一个新的查询。我相信有更好的方法可以做到这一点。提前谢谢 for ($i = 0; $i <= $total_difference; $i++){ $date = strtotime("+$i day", strtotime($start_date)); $check_date = date("Y-m-d", $date); // Her

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

  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";

 }
对于($i=0;$i db->select(“选择COUNT(任务日期))作为从
时间管理);
$this->db->from('time_management');
$this->db->where('task\u date',$check\u date);
$result=$this->db->get()->row_array();
$count=$result['count'];
echo“检查日期为$count时的计数”;
}

您正在执行此查询:

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所说,在你的结果中有任务日期很方便,所以我补充说

我将让您将其转换为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);
}
//假设您从这些
$start_date='2018-05-04';
$total_difference=6;
//假设查询结果如下所示
$counts=['2018-05-04'=>5,
'2018-05-06' => 3];
//然后可以像这样插入零计数结果:

对于($days=0;$days您正在执行此查询:

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所说,在你的结果中有任务日期很方便,所以我补充说

我将让您将其转换为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);
}
//假设您从这些
$start_date='2018-05-04';
$total_difference=6;
//假设查询结果如下所示
$counts=['2018-05-04'=>5,
'2018-05-06' => 3];
//然后可以像这样插入零计数结果:

对于($days=0;$daysSo,您有一个日期数组:('2018-05-04'、'2018-05-05'、'2018-06-01'),将它们内爆为字符串并在运算符中使用,按日期对结果进行分组:

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`;

对于不存在的记录,我能想到的最佳解决方案是选择循环中的所有现有记录,并将其从日期数组中删除。剩下的记录将不存在,其计数将为零。

因此,您有一个日期数组:('2018-05-04','2018-05-05','2018-06-01'),将其内爆为字符串并在运算符中使用,按日期对结果进行分组:

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`;


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

mysql的用例函数,所以您希望在
时间管理中为每个总的数据都计算
任务日期的计数ates由mysql的
for
loop?用例函数定义,因此您希望
task\u date
time\u management
中为
for
loop?选择count(task\u date)作为计数,task\u date
而不是
选择count(task\u date)作为COUNT
。他可能想在代码中进一步使用task\u日期。假设我按照您的逻辑执行以下查询SELECT COUNT(task\u date)作为时间管理的计数,其中任务日期介于“2018-07-05”和“2018-07-09”之间,按任务日期分组,仅显示2个计数,因为在这些日期内仅添加了两个任务,但假设显示所有计数(0)在这两个日期之间,即使他们没有added@vivek_23:是的,当然,我忘了,我会添加它。@Nadeem抱歉,我们忽略了它。让你知道是的,不包括零计数。让我想想。在mysql中不容易做到,我会在PHP中添加零结果。想想看,你使用mysql检索数据,然后使用PHP这很正常。我会将代码添加到我的答案中。
选择COUNT(task_date)作为COUNT,task_date
而不是
选择COUNT(task_date)作为COUNT
。他可能想在代码中进一步使用task_date。假设我按照您的逻辑执行以下查询选择COUNT(任务日期)作为时间管理的计数,其中任务日期介于“2018-07-05”和“2018-07-09”之间,按任务日期分组,仅显示2个计数,因为在这些日期内仅添加了两个任务,但假设显示所有计数(0)在这两个日期之间,即使他们没有added@vivek_23:是的,当然,我忘了,我会添加它。@Nadeem抱歉,我们忽略了它。让你知道是的,不包括零计数。让我想想。在mysql中不容易做到,我会在PHP中添加零结果。想想看,你使用mysql检索数据,然后使用PHP这很正常。我会把代码添加到我的答案中。我还想计算那些没有添加任务的日期。意思是计数0@Nadeem你的意思是,日期,记录不存在的地方?@Nadeem让我看看。@Nadeem更新了答案。看起来合乎逻辑,让我试试,然后我会验证答案。我所以,想计算那些尚未添加任务的日期。表示计数0@Nadeem你是说,日期,记录在哪里