2017-09-29 49 views
0

我正在對每個項目進行計數和求和,並且需要數組看起來像這樣。來自查詢的多個數組

[Date] => 
     [device_type1] => [all the data] 
     [device_type2] => [all the data] 

事情是我通過每做一個搜索,然後所有的人都返回一個日期,我需要所有的人都被下一個日期,該數組裏面保存每個設備的關鍵和裏面的所有信息。這是我到目前爲止。

$all_device_types = array('pole','covert','firewatch','internet','trailer','slave','project'); 
foreach ($all_device_types as $adt) { 
    $du->select("CONCAT(YEAR(uptime_date),'-',MONTH(uptime_date),'-',DAY(uptime_date)) as year_month_day, 

          SUM(uptime_router) as router, 

          COUNT(uptime_router) as router_count, 

          uptime_device_type as device_type, 

          date(uptime_date) as data_date"," 

          WHERE uptime_device_type = '".$adt."' 

          GROUP BY CONCAT(YEAR(uptime_date),'-',MONTH(uptime_date),'-',DAY(uptime_date)) 

          ORDER BY uptime_date ASC"); 


          $all_results = array(); 
          while($all_row = $du->fetch()){ 

           if ($adt == $all_device_types[0]) { 
            $dates[] = $all_row['data_date']; 
            $adt_0 = $all_row; 
           } elseif ($adt == $all_device_types[1]) { 
            $adt_1[] = $all_row; 
           } elseif ($adt == $all_device_types[2]) { 
            $adt_2[] = $all_row; 
           } elseif ($adt == $all_device_types[3]) { 
            $adt_3[] = $all_row; 
           } elseif ($adt == $all_device_types[4]) { 
            $adt_4[] = $all_row; 
           } elseif ($adt == $all_device_types[5]) { 
            $adt_5[] = $all_row; 
           } elseif ($adt == $all_device_types[6]) { 
            $adt_6[] = $all_row; 
           } 

          } 

         } 

其中一個結果如下所示。

[pole] => Array 
     (
      [year_month_day] => 2017-9-5 
      [router] => 4408 
      [router_count] => 4620 
      [device_type] => pole 
      [data_date] => 2017-09-05 
     ) 

回答

0

它看起來可以簡化一下。您可以將設備類型添加到您的GROUP BY中,並在一次查詢中獲得所有結果,而不是遍歷設備類型併爲每個設備類型運行單獨的查詢。

我認爲CONCAT(YEAR(uptime_date),'-',MONTH(uptime_date),'-',DAY(uptime_date))應該輸出與date(uptime_date)相同的東西,你應該可以在你的GROUP BY和ORDER BY子句中使用別名。

$du->select("DATE(uptime_date) as data_date, 
      uptime_device_type as device_type, 
      SUM(uptime_router) as router, 
      COUNT(uptime_router) as router_count, 
      GROUP BY data_date, device_type 
      ORDER BY data_date, device_type"); 

如果我錯了,你確實需要CONCAT版本,添加它,當然,更主要的是增加DEVICE_TYPE到GROUP BY和消除WHERE子句。

然後,當您獲取結果時,可以將它們直接插入到所需的多維結構中。

while($row = $du->fetch()) { 
    $all_results[$row['data_date']][$row['device_type']][] = $row; 

    // to calculate totals for all the devices for each date 
    if (!isset($all_results[$row['data_date']]['all_devices']) { 
     // initialize if not set 
     $all_results[$row['data_date']]['all_devices'] = [ 
      'router' => 0, 'router_count' => 0]; 
    } 
    // increment values 
    $all_results[$row['data_date']]['all_devices']['router'] += $row['router']; 
    $all_results[$row['data_date']]['all_devices']['router_count'] += $row['router_count']; 
} 
+0

太棒了!非常感謝!另外,如果我想添加另一個字段All_devices ...每個日期都會計算設備路由器和路由器的數量並且有總數?這將包含在while循環中還是在所有之後? – Derrand

+0

不客氣。你應該可以在while循環中做到這一點。我可以更新答案給你看。 –

+0

非常感謝你的ID欣賞。 – Derrand