2016-04-13 31 views
1

私がしようとしているのは、当時の時間に関する「票」のグループ量です。時間(時間)に基づいてデータを効率的に分割する

は、私はこのようなデータを持っていると言う:

$array = array(
    array('vote' => 'up', 'timestamp' => '1460514600'), //10.30am 
    array('vote' => 'up', 'timestamp' => '1460514600'), //10.30am 
    array('vote' => 'down', 'timestamp' => '1460514600'), //10.30am 
    array('vote' => 'up', 'timestamp' => '1460514600'), //10.30am 
    array('vote' => 'down', 'timestamp' => '1460514600'), //10.30am 
    array('vote' => 'up', 'timestamp' => '1460529000'), //2.30pm 
    array('vote' => 'up', 'timestamp' => '1460529000'), //2.30pm 
    array('vote' => 'down', 'timestamp' => '1460529000'), //2.30pm 
); 

私は現在、24時間ベースの時間にセクション、それに次き:

必要に応じてデータを返す
$new = array(); 
foreach($array as $element){ 
    $hour = date('H', $element['timestamp']); 
    if(!isset($new[$hour])){ 
     $new[$hour] = array(
      'up' => 0, 
      'down' => 0, 
     ); 
    } 
    // check & add 
    switch($element['vote']){ 
     case "up": 
      $new[$hour]['up']++; 
      break; 
     case "down": 
      $new[$hour]['down']++; 
      break; 
    } 

} 

Array 
(
    [10] => Array 
     (
      [up] => 3 
      [down] => 2 
     ) 

    [14] => Array 
     (
      [up] => 2 
      [down] => 1 
     ) 

) 

このセクションを行うより効率的な方法はありますか?たとえそれがMySQLから直接行うことは可能ですか?

+0

querry – Rizier123

+0

おそらくすべてなんとか私にとってはかなりよさそうだ - それについて考えていたが、それは高価ではないでしょうか? (*多くの多くのレコード*) –

+0

@Dagonで – Darren

答えて

2

ここには、SQLの第一人者は、私が思い付くことができる最も近いが、それが実際として保存されている場合だけ(フォーマットされた時間にGROUP BYを持つすべての投票の浮き沈みをカウントアップするための簡単なSUMCASEを使用することですUNIXタイムスタンプ)。

SELECT 
    DATE_FORMAT(FROM_UNIXTIME(`timestamp`), '%H') 
    AS group_hour, 
    SUM(CASE WHEN vote = 'up' THEN 1 ELSE 0 END) AS total_up, 
    SUM(CASE WHEN vote = 'down' THEN 1 ELSE 0 END) AS total_down 
FROM table_name 

GROUP BY `group_hour` 

Somewhat of a demo

+0

優秀!これはまさに私が探しているものです!乾杯ゴースト – Darren

+1

@ダーレン確かにおかげでこれは助けてうれしい – Ghost

関連する問題