2016-06-01 14 views
0

私は現在、2つの日付の間のテーブルからすべての値をフェッチしています。 1日あたりの値は必ずしも同じではなく、2つの日付の間の値の算術平均(これが正しい用語であるかどうかわからない)を行う必要があります。例えば2日間の1日あたりの算術平均

これは私はこのようないくつかのことを行う必要があり、私のテーブルの要素のいくつか

['lig'] ['date'] 
170  2016-05-26 
190  2016-05-26 
192  2016-05-26 
196  2016-05-25 
181  2016-05-25 
187  2016-05-25 
195  2016-05-25 

です:

日26意味:+ 190 170 + 192/3 = 184
平均25日目:196 + 181 + 187 + 4分の195 = 189,75



これは私が日付間のすべての値を取得している方法です。

function listDates($table, $beginDate, $endDate){ 
    $select = "SELECT * FROM $tabela WHERE date >= :beginDate AND date <= :endDate ORDER BY date"; 
    $inst = $this->liga->prepare($select); 
      $inst->bindParam(':beginDate', $begin); 
      $inst->bindParam(':endDate', $end); 
    $inst->execute(); 
    return $inst->fetchAll();    

} 

これは私がしたい日付の間隔を取得し、その間隔

$previous_week = strtotime("-1 week"); 
$today = strtotime("-1 day"); 

$start_week = strtotime("today", $previous_week); 
$end_week = strtotime ("next day", $today); 

$start_week = date("Y-m-d H:i:s", $start_week); 
$end_week = date("Y-m-d H:i:s", $end_week); 

$values = $listValues->listDates("meanVal",$start_week,$end_week); 

     foreach($values as $val){ 

      echo $val['lig']; 
      echo $val['tip']; 
      echo $val['hum']; 
      echo $val['date'];  
} 

しかし、どのように間の値iは、カウントを作ることができる(?)一日あたりの平均値を取得するために、リスト方法ですか?誰も私を助けることができますか? これが明示的かどうかわからない、英語は母国語ではなく、時には何かを説明する方法がわからないことがあります。どうもありがとう。

+1

を選択AVG(LIG)yourtableグループから日付で? – Gar

+0

@Garどのような平均がどの日付に対応しているか、どのように分かりますか? – Strawberry

+1

@strawberry:日付でyourtableグループから日付を選択してください、私は謝罪します – Gar

答えて

0

あなたは他の回答で述べたクエリを変更できない場合は、ここで希望を取得するPHPコードがあります結果。

  1. キーを日付として新しい配列を作成します。
  2. 各日付の平均値を計算します。

PHPコード

foreach($values as $val){ 
    // generates array with date as key 
    $dates[$val['date']][] = $val['lig']; 
} 

foreach($dates as $k=>$v){ 
    // calculates mean value for each date 
    $count = count($v); 
    $sum = array_sum($v); 
    $mean = $sum/$count; 
    echo $k.":".$mean; 
} 

アウト置く:

2016-05-26:184 
2016-05-25:189.75 
+0

データベースレベルでこれを行うのはお勧めできません。パフォーマンスが良い方は – niceman

+0

@nicemanこれは別の解決策です。クエリを変更するオプションがあります。 –

+0

hmmm彼は変数にクエリを割り当てているので、彼が割り当てたものを変更することができます。なぜ彼はクエリを変更できませんでしたか? – niceman

1

私はあなたのSQLを与え、あなたはPHPの一部を自分で把握もらおう:

select *,avg(lig) as day_mean 
from table 
where date >= begindate and date <= enddate 
group by date 
order by date 

ここで重要なのはgroup by句、すべての明確なため(それはここではavgです)集計関数を適用することにより、グループですそれ以降の値(date)。第によって缶基によって

グループの最初のフィールドによって複数のフィールドのグループ化にと等しい値を基に等等しい

に平均等group byで使用することができる多くの集約関数があり、合計、最大、カウント、分など。

ここでノートのカップル:
1 - 私はあなたが単にそれを削除平均が必要な場合は、他のデータを必要と思ったので、私は*を残しました。
2つ前のコードのキーワードは平均になります(そうでなければその名前はavg(lig)となります)。これはPHPの部分でより良い名前を付けるためですが、別の目的を果たします。バツ ?またはそれに関する制約は何ですか?前のコードの末尾にhaving day_mean>Xを追加することでこれを実現します(どこに置くことができるのかを後に置くことができますが、集約カラムにのみ使用されます。whereはこれらの列に使用できません)。
3 - where節がグループ化される前に適用されている場合、mysqlは最初にwhere句を満たす行を選択してグループ化します。これはグループ化機能がオンになっていない選択された行にのみ適用されるためテーブル全体

0

わからないあなたは、コード賢明必要がありますが、このクエリはあなたの例と同じ値を生成するもの:

$ mysql -e 'desc foo' 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| lig | int(11) | NO |  | NULL |  | 
| date | date | NO |  | NULL |  | 
+-------+---------+------+-----+---------+-------+ 


$ mysql -e 'select sum(lig) as sum, 
      count(*) as ligs, sum(lig)/count(*) as average 
      from foo group by date ' 
+------+------+----------+ 
| sum | ligs | average | 
+------+------+----------+ 
| 759 | 4 | 189.7500 | 
| 552 | 3 | 184.0000 | 
+------+------+----------+ 
関連する問題