Php 对同一字段进行两次计数

Php 对同一字段进行两次计数,php,mysql,Php,Mysql,我试图将同一字段计数两次,因为当前设置将工作代码输入为“10”、“11”、“12”、“13”、“40”、“400”、“80”作为已完成的作业,而其他工作代码如55、56、57表示未完成作业 通过下面的内容,我成功地计算了工时代码表并显示了成功完成的工时数量,但我很难将未完成的工时(即55、56等)计算为与显示相同的表格 下面是我的代码 <?php require 'db.php'; $sqltran = mysqli_query($con, "SELECT *, ROUND(S

我试图将同一字段计数两次,因为当前设置将工作代码输入为“10”、“11”、“12”、“13”、“40”、“400”、“80”作为已完成的作业,而其他工作代码如55、56、57表示未完成作业

通过下面的内容,我成功地计算了工时代码表并显示了成功完成的工时数量,但我很难将未完成的工时(即55、56等)计算为与显示相同的表格

下面是我的代码

<?php 
require 'db.php';

    $sqltran = mysqli_query($con, "SELECT *, ROUND(SUM(Sales),0), ROUND(AVG(Sales),2), COUNT(Work_Code) FROM results_tbl_1 WHERE RECORD_ID BETWEEN 468100 AND 500000 AND Work_Code IN ('10', '11', '12', '13', '40', '400', '80')  GROUP BY ENG_ID ORDER BY ROUND(SUM(Sales),0) DESC ") or die(mysqli_error($con));

    $arrVal = array();

    $i=1;
    while ($rowList = mysqli_fetch_array($sqltran)) {

                    $name = array(
                            'num' => '<img alt="" height="16" src="./top10.png" width="16">' . $i,


                            'eng'=> $rowList['ENG_ID'],

                            'totalvisits'=> $rowList['COUNT(Work_Code)'],

                            'ajv'=> '£' . $rowList['ROUND(AVG(Sales),2)'],

                            'sales'=> '£' . $rowList['ROUND(SUM(Sales),0)'],





                        );      


                        array_push($arrVal, $name); 
        $i++;           
    }
         echo  json_encode($arrVal);        


    mysqli_close($con);

也许您希望将UNION用于具有相应工作代码的两个SELECT。

我可能缺少明显的,但为什么不在“工作代码在”子句中包含未完成的代码?

创建两个新数组,一个用于表示完成的工作代码,另一个用于表示未完成的工作代码。另外,在这种情况下,不要尝试在查询中进行计数

然后,在循环浏览结果时,使用
array\u search()`对数组测试
$row['Work\u code']。您还需要两个变量来存储计数

它看起来像这样:

$completedJobs = array(1,2,3,4,5);
$incompleteJobs = array(7,8,9,10,11);
$completeTotal = 0;
$incompleteTotal = 0;
$i=1;
    while ($rowList = mysqli_fetch_array($sqltran)) {
      //I've stripped out what is not relevant to my example
      if(array_search($rowList['Work_Code'], $completedJobs) {
           $completeTotal++;                        
     }
     if(array_search($rowList['Work_code'],$incompleteJobs){
           $incompleteTotal++;
     }

}

只需在
子句中使用不同的值运行两个单独的查询:

完成的工作:

<?php 
require 'db.php';

$sql_complete = mysqli_query($con, "SELECT *, ROUND(SUM(Sales),0), ROUND(AVG(Sales),2), COUNT(Work_Code) FROM results_tbl_1 WHERE RECORD_ID BETWEEN 468100 AND 500000 AND Work_Code IN ('10', '11', '12', '13', '40', '400', '80')  GROUP BY ENG_ID ORDER BY ROUND(SUM(Sales),0) DESC ") or die(mysqli_error($con));

while ($rowList = mysqli_fetch_array($sql_complete)) {
    // Outputs the number of completed jobs:
    echo $rowList['COUNT(Work_Code)'];
}
?>

未完成作业:

<?php 

$sql_incomplete = mysqli_query($con, "SELECT *, ROUND(SUM(Sales),0), ROUND(AVG(Sales),2), COUNT(Work_Code) FROM results_tbl_1 WHERE RECORD_ID BETWEEN 468100 AND 500000 AND Work_Code IN ('55', '56', '57' )  GROUP BY ENG_ID ORDER BY ROUND(SUM(Sales),0) DESC ") or die(mysqli_error($con));

while ($rowList = mysqli_fetch_array($sql_incomplete)) {
    // Outputs the number of incomplete jobs:
    echo $rowList['COUNT(Work_Code)'];
}
?>

假设不在“已完成作业”代码列表中的所有代码都不完整,查询可以简单如下:

SELECT *, ROUND(SUM(IF(complete, Sales, null)),0), ROUND(AVG(IF(complete, Sales, null)),2), COUNT(IF(complete, 1, null)), COUNT(IF(complete, null, 1)) 
FROM ( SELECT *, Work_Code IN ('10', '11', '12', '13', '40', '400', '80') as complete
  FROM results_tbl_1 
  ) separated
WHERE RECORD_ID BETWEEN 468100 AND 500000 
GROUP BY ENG_ID 
ORDER BY ROUND(SUM(Sales),0) DESC
一些与问题无关的事情:

  • 切勿在聚合查询中执行
    SELECT*,
  • 对聚合列使用别名
因此,更好的查询版本是:

SELECT 
  ENG_ID, 
  ROUND(SUM(IF(complete, Sales, null)),0) as Total_sales_complete, 
  ROUND(AVG(IF(complete, Sales, null)),2) as Average_sales_complete, 
  COUNT(IF(complete, 1, null)) as Count_complete, 
  COUNT(IF(complete, null, 1)) as Count_incomplete
FROM ( SELECT *, Work_Code IN ('10', '11', '12', '13', '40', '400', '80') as complete
  FROM results_tbl_1 
  ) separated
WHERE RECORD_ID BETWEEN 468100 AND 500000 
GROUP BY ENG_ID 
ORDER BY Total_sales_complete DESC
编辑:

php代码中唯一的更改是使用别名:

$name = array(
 'num' => '<img alt="" height="16" src="./top10.png" width="16">' . $i,
 'eng'=> $rowList['ENG_ID'],
 'totalvisits'=> $rowList['Count_complete'],
 'ajv'=> '£' . $rowList['Total_sales_complete'],
 'sales'=> '£' . $rowList['Average_sales_complete'],

 'theSecondCount'=> $rowList['Count_incomplete'],
);    

作为旁注,标题“Total Jobs”有点误导,因为它显示了完成的作业的计数,“Total”一词意味着所有作业。

为什么不使用工作代码的ID(如55、56、57)运行第二次查询,以向用户显示标记为未完成的作业数量我仍然没有看到问题。运行第一个查询(使用10、11、12)并从该结果中获取
计数。然后运行第二个查询(55、56等),并从第二个结果中获得
计数。怎么了?唯一改变的是
in
条件下的ID,这显然会影响计数/结果。但这就是你想要的。你想知道每种代码的作业数吗?因此,您可能希望按作业代码分组,因为这是指已完成作业的工作代码10、11等,其他工作代码55、56等表示未完成作业,因此我希望显示未完成作业的数量以及已完成作业。谢谢,但我如何在表上显示响应?-我已经用我用来在我的表格上显示问题的代码更新了上面的问题。谢谢,但是我怎样才能在我的表格上显示回答呢我已经用我用来在我的表格上显示的代码更新了上面的问题。更新了答案,但老实说,javascript“我如何显示响应”部分是在我发布答案后添加的。它显示出绝对缺乏研究努力,违反了不将多个问题合并为一个问题的政策。请以后避免使用。谢谢,但是我如何在我的表格上显示响应我已经用我用来在我的表格上显示的代码更新了上面的问题。一种方法是在呈现页面时将计数作为值包含在隐藏输入中`回声“;然后在jQuery中获取它的值:当您执行
json_encode($arrVal)时中包含来自数据库的值。因此,只要它们在单独的数组键中
$arrVal['num_complete_jobs']
$arrVal['num_complete_jobs']
您就应该仍然能够在ajax中引用它们
$name = array(
 'num' => '<img alt="" height="16" src="./top10.png" width="16">' . $i,
 'eng'=> $rowList['ENG_ID'],
 'totalvisits'=> $rowList['Count_complete'],
 'ajv'=> '£' . $rowList['Total_sales_complete'],
 'sales'=> '£' . $rowList['Average_sales_complete'],

 'theSecondCount'=> $rowList['Count_incomplete'],
);    
          {
              field: 'theSecondCount',
              title: 'Incomplete Jobs',
              sortable: false,
          }