Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取两个数组之间的差异_Php_Mysql_Arrays - Fatal编程技术网

Php 获取两个数组之间的差异

Php 获取两个数组之间的差异,php,mysql,arrays,Php,Mysql,Arrays,我有两个搜索查询-一个将显示过去7天的内容。另一个将显示2周前的内容。 两者都很好用。但是,我想从第一个查询中获取结果,并从第二个查询中获得差异。然后显示具有差异的第一个查询 $result_account = $db->query(" SELECT nid , COUNT(cat) AS qty , dte , descript , cat , name , user FROM client_note AS cn J

我有两个搜索查询-一个将显示过去7天的内容。另一个将显示2周前的内容。 两者都很好用。但是,我想从第一个查询中获取结果,并从第二个查询中获得差异。然后显示具有差异的第一个查询

$result_account = $db->query("
SELECT nid
     , COUNT(cat) AS qty
     , dte
     , descript
     , cat
     , name
     , user 
  FROM client_note AS cn 
  JOIN client_note_tag_items AS cnti 
    ON cnti.note_id = cn.nid 
  JOIN client_note_tags AS cnt 
    ON cnt.tag_id = cnti.tag_id 
 WHERE dte >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) 
   AND name NOT LIKE 'Resolution%' 
 GROUP 
    BY cat 
 ORDER 
    BY qty DESC 
 LIMIT 5
");
       if($count_account = $result_account->num_rows) {
               while($row = $result_account->fetch_object()){

          echo "<tr>";
          echo "<td><h6>".$row->cat."</h6></td><td><h3 class='text-primary'>".$row->qty."</h3></td>";
          echo "</tr>";
          }
       }

$result_previous = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE (dte BETWEEN DATE_SUB(CURDATE(), INTERVAL 21 DAY) AND DATE_SUB(CURDATE(), INTERVAL 14 DAY)) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC LIMIT 5");
    if($count_previous = $result_previous->num_rows) {
            while($row_p = $result_previous->fetch_object()){

          echo "<tr>";  
          echo "<td><h6>".$row_p->cat."</h6></td><td><h3 class='text-primary'>".$row_p->qty."</h3></td>";
          echo "</tr>";


            }
    }
第二个查询将导致:

Category   - Qty
Baseball   - 45
Football   - 33
Soccer     - 21
Hockey     - 7
Basketball - 3
Category   - Qty
Basketball - 38
Soccer     - 28
Hockey     - 16
Football   - 12
Baseball   - 12
现在我想这样显示它

Category   - Qty Difference
Baseball   - 45  +33
Football   - 33  +21
Soccer     - 21  -7
Hockey     - 7   -9
Basketball - 3   -35

将第一组数字存储在两个关联数组中,然后在第二个循环中计算差异

$initial = [];
$diff = [];
$result_account = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE `dte` >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC LIMIT 5");
   if($count_account = $result_account->num_rows) {
           while($row = $result_account->fetch_object()){

      echo "<tr>";
      echo "<td><h6>".$row->cat."</h6></td><td><h3 class='text-primary'>".$row->qty."</h3></td>";
      echo "</tr>";
      $initial[$row->cat] = $row->qty; //remember 1st results
      $diff[$row->cat] = $row->qty; //to be used
      }
   }

$result_previous = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE (dte BETWEEN DATE_SUB(CURDATE(), INTERVAL 21 DAY) AND DATE_SUB(CURDATE(), INTERVAL 14 DAY)) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC LIMIT 5");
if($count_previous = $result_previous->num_rows) {
        while($row_p = $result_previous->fetch_object()){

      echo "<tr>";  
      echo "<td><h6>".$row_p->cat."</h6></td><td><h3 class='text-primary'>".$row_p->qty."</h3></td>";
      echo "</tr>";
      $diff[$row_p->cat] -= $row_p->qty; 

        }
}
//now print the initial qty and the difference
$cats = array_keys($diff);
for($i=0; $i<sizeof($cats); $i++){
    echo "<tr>";
    echo "<td><h6>".$cats[$i]."</h6></td>";
    $first = $initial[$cats[$i]];
    echo "<td><h3 class='text-primary'>$first</h3></td>"
    $d = $diff[$cats[$i]];
    $sign = $d < 0 ? "-" : "+";
    echo "<td><h3 class='text-primary'>$sign $d</h3></td>";
    echo "<tr>";
}
$initial=[];
$diff=[];
$result\u account=$db->query(“选择nid,COUNT(cat)作为数量,dte,descript,cat,name,user FROM client\u note AS cn JOIN client\u note\u tag\u项目作为cnti上的cnti.note\u id=cn.nid JOIN client\u tags AS cnt ON cnt.tag\u id=cnti.tag\u id其中`dte`>=DATE\u SUB(CURDATE(),间隔7天)名称与“分辨率%”不同,按cat订单分组,按数量描述限制5”);
如果($count\u account=$result\u account->num\u行){
而($row=$result\u account->fetch\u object()){
回声“;
回显“$row->cat.”“$row->qty.”;
回声“;
$initial[$row->cat]=$row->qty;//记住第一个结果
$diff[$row->cat]=$row->qty;//待使用
}
}
$result\u previous=$db->query(“选择nid,COUNT(cat)作为数量,dte,descript,cat,name,user FROM client\u note AS cn JOIN client\u note\u tag\u项目作为cnti.note\u id=cn.nid JOIN client\u tags AS cnt ON cnt.tag\u id=cnti.tag\u id其中(日期子(CURDATE(),间隔21天)和日期子(CURDATE(),间隔14天))之间的dte))名称与“分辨率%”不同,按cat订单分组,按数量描述限制5”);
如果($count\u previous=$result\u previous->num\u rows){
而($row\u p=$result\u previous->fetch\u object()){
回声“;
回显“$row\U p->cat.”“$row\U p->qty.”;
回声“;
$diff[$row\U p->cat]=$row\U p->数量;
}
}
//现在打印初始数量和差异
$cats=数组_键($diff);

对于($i=0;$i),我要做的是创建另一个数组,在键->值的基础上保存第一个查询中的值,在下一个查询中,只需从数组中的相应条目中减去值

我认为通过使用2个查询,这是最简单、最快捷的方法

注意:我没有测试这段代码

注2:我假设第一类中缺失的运动项目将计为0

注3:我写的代码只是为了显示一种计算差异的方法。请告诉我是否应该更新它以提供与您所需的完全相同的输出

$results = array();

$result_account = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE `dte` >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC LIMIT 5");
   if($count_account = $result_account->num_rows) {
      while($row = $result_account->fetch_object()){

        //output this query results here
        $results[$row->cat] = $row->qty;
      }
   }

$result_previous = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE (dte BETWEEN DATE_SUB(CURDATE(), INTERVAL 21 DAY) AND DATE_SUB(CURDATE(), INTERVAL 14 DAY)) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC LIMIT 5");
if($count_previous = $result_previous->num_rows) {
    while($row_p = $result_previous->fetch_object()){

      //output this query results here
      $results[$row_p->cat] = ((isset($results[$row_p->cat])) ? $results[$row_p->cat] : 0 ) - $row_p->qty;
    }
}


foreach( $results as $key => $result) {
  echo "<tr>";  
  echo "<td><h6>".$key."</h6></td><td><h3 class='text-primary'>".$result."</h3></td>";
  echo "</tr>";
}
$results=array();
$result\u account=$db->query(“选择nid,COUNT(cat)作为数量,dte,descript,cat,name,user FROM client\u note AS cn JOIN client\u note\u tag\u项目作为cnti上的cnti.note\u id=cn.nid JOIN client\u tags AS cnt ON cnt.tag\u id=cnti.tag\u id其中`dte`>=DATE\u SUB(CURDATE(),间隔7天)名称与“分辨率%”不同,按cat订单分组,按数量描述限制5”);
如果($count\u account=$result\u account->num\u行){
而($row=$result\u account->fetch\u object()){
//在此处输出此查询结果
$results[$row->cat]=$row->qty;
}
}
$result\u previous=$db->query(“选择nid,COUNT(cat)作为数量,dte,descript,cat,name,user FROM client\u note AS cn JOIN client\u note\u tag\u项目作为cnti.note\u id=cn.nid JOIN client\u tags AS cnt ON cnt.tag\u id=cnti.tag\u id其中(日期子(CURDATE(),间隔21天)和日期子(CURDATE(),间隔14天))之间的dte))名称与“分辨率%”不同,按cat订单分组,按数量描述限制5”);
如果($count\u previous=$result\u previous->num\u rows){
而($row\u p=$result\u previous->fetch\u object()){
//在此处输出此查询结果
$results[$row\u p->cat]=((isset($results[$row\u p->cat])?$results[$row\u p->cat]:0)-$row\u p->数量;
}
}
foreach($results作为$key=>$result){
回声“;
回显“$key.”“$result.”;
回声“;
}
更新-显示第一周及其旁边的差异

你可以试试这个,我去掉了foreach,只使用了查询循环

注意:同样,这是未经测试的代码

$results = array();

$result_account = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE `dte` >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC LIMIT 5");

$result_previous = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE (dte BETWEEN DATE_SUB(CURDATE(), INTERVAL 21 DAY) AND DATE_SUB(CURDATE(), INTERVAL 14 DAY)) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC");
if($count_previous = $result_previous->num_rows) {
    while($row_p = $result_previous->fetch_object()){

      //output this query results here
      $results[$row_p->cat] = $row_p->qty;
    }
}

if($count_account = $result_account->num_rows) {
    while($row = $result_account->fetch_object()){

        $difference = $row->qty - ((isset($results[$row->cat])) ? $results[$row->cat] : 0 );

        echo "<tr>";  
        echo "<td><h6>".$row->cat."</h6></td><td><h3 class='text-primary'>".$row->qty."</h3></td><td><h3 class='text-primary'>".$difference."</h3></td>";
        echo "</tr>";
    }
}
$results=array();
$result\u account=$db->query(“选择nid,COUNT(cat)作为数量,dte,descript,cat,name,user FROM client\u note AS cn JOIN client\u note\u tag\u项目作为cnti上的cnti.note\u id=cn.nid JOIN client\u tags AS cnt ON cnt.tag\u id=cnti.tag\u id其中`dte`>=DATE\u SUB(CURDATE(),间隔7天)名称与“分辨率%”不同,按cat订单分组,按数量描述限制5”);
$result\u previous=$db->query(“选择nid,COUNT(cat)作为数量,dte,descript,cat,name,user FROM client\u note AS cn JOIN client\u note\u tag\u项目作为cnti.note\u id=cn.nid JOIN client\u tags AS cnt ON cnt.tag\u id=cnti.tag\u id其中(日期子(CURDATE(),间隔21天)和日期子(CURDATE(),间隔14天))之间的dte))名称与“分辨率%”不同,按类别分组,按数量描述);
如果($count\u previous=$result\u previous->num\u rows){
而($row\u p=$result\u previous->fetch\u object()){
//在此处输出此查询结果
$results[$row\u p->cat]=$row\u p->qty;
}
}
如果($count\u account=$result\u account->num\u行){
而($row=$result\u account->fetch\u object()){
$difference=$row->qty-((设置($results[$row->cat])?$results[$row->cat]:0);
回声“;
回显“$row->cat.”“$row->qty.”“$DIFFER.”;
回声“;
}
}

使用条件聚合,也可以在单个SQL查询中比较不同时间段内的相同数据:

SELECT 
    cat, 
    SUM(IF(dte >= d.start1, 1, 0)) AS qty, 
    SUM(IF(dte >= d.start1, 1, 0)) - SUM(IF(dte < d.end2, 1, 0)) AS Difference, 
FROM 
    (SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY) start1, DATE_SUB(CURDATE(), INTERVAL 14 DAY) end2) as d
    CROSS JOIN client_note AS cn 
    JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid 
    JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id 
WHERE
    dte >= DATE_SUB(CURDATE(), INTERVAL 21 DAY) 
    AND name NOT LIKE 'Resolution%' 
GROUP BY cat 
ORDER BY qty DESC 
LIMIT 5
选择
猫,
总和(如果(dte>=d.start1,1,0))作为数量,
求和(如果(dte>=d.start1,1,0))-求和(如果(dte=日期(CURDATE(),间隔21天)
$result_account = $db->query("
SELECT nid
     , COUNT(cat) AS qty
     , dte
     , descript
     , cat
     , name
     , user 
  FROM client_note AS cn 
  JOIN client_note_tag_items AS cnti 
    ON cnti.note_id = cn.nid 
  JOIN client_note_tags AS cnt 
    ON cnt.tag_id = cnti.tag_id 
 WHERE dte >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) 
   AND name NOT LIKE 'Resolution%' 
 GROUP 
    BY cat 
 ORDER 
    BY qty DESC 
 LIMIT 5
");

if($count_account = $result_account->num_rows) {
    while($row = $result_account->fetch_object()){
        $$key[$row->cat]= $row->qty;
    }
}

$result_previous = $db->query("SELECT nid, COUNT(cat) AS qty, dte, descript, cat, name, user FROM client_note AS cn JOIN client_note_tag_items AS cnti ON cnti.note_id = cn.nid JOIN client_note_tags AS cnt ON cnt.tag_id = cnti.tag_id WHERE (dte BETWEEN DATE_SUB(CURDATE(), INTERVAL 21 DAY) AND DATE_SUB(CURDATE(), INTERVAL 14 DAY)) AND name NOT LIKE 'Resolution%' GROUP BY cat ORDER BY qty DESC LIMIT 5");
if($count_previous = $result_previous->num_rows) {
    while($row_p = $result_previous->fetch_object()){
        $second_array[$row_p->cat]= $row_p->qty;
    }
}

foreach ($first_array as $key => $value) {
    $difference_array[$key]=$value - $second_array[$key];
}

foreach ($difference_array as $key => $value){
    echo "<tr>";
    echo "<td><h6>".$key."</h6></td><td><h3 class='text-primary'>".$value."</h3></td>";
    echo "</tr>";
}