2012-02-08 15 views
1

が、私はこのクエリを持っている範囲PHPのARRAY表示グループ化されたデータは、

$query = mysql_query ("SELECT type, count(*), date FROM tracking WHERE htcode='$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') GROUP BY type, date ORDER BY date ASC"); 

このコード:

2012-02-01/viewed = 2 
2012-02-03/emailed = 1 
2012-02-04/shared = 1 
2012-02-05/viewed = 1 
2012-02-07/viewed = 2 
2012-02-07/shared = 3 
2012-02-07/emailed = 1 
2012-02-07/printed = 1 

がどのように私が取ることができる:

while ($result = mysql_fetch_assoc($query)){ 
echo $result['date'] .'/' .$result['type'].' = ' .$result['count(*)']; 
echo '<br>'; 
} 

は私を与えますクエリー配列を取得して、今日、昨日、そして昨日のすべてについて(閲覧、共有、メール送信、印刷、使用)期間(過去30日など)?

答えて

1

特定の日付範囲のすべての結果を取得するには、日付でグループ化しないでください。代わりにWHERE句を使用してカウントの日付を制限します。それ以外の場合、クエリは非常に似ています。

$query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type"); 

ここではわかりやすくするために、いくつかのラインの上にフォーマットされただけでクエリ自体です:

SELECT type, count(*) 
FROM tracking 
WHERE htcode = '$htG' 
    AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') 
    AND date >= '$start_date' AND date <= '$end_date' 
GROUP BY type 

ちょうどあなたが$start_date$end_date最初の値を設定してください。例えば、今日のためにちょうどこれにそれらの両方を設定したい:date('Y-m-d')YYYY-MM-DDのような形式で、ちょうど今日の日付であることを

$start_date = date('Y-m-d'); 
$end_date = date('Y-m-d'); 

注意を。

昨日のために、あなたはdate()関数に昨日のタイムスタンプを渡しますが、同じフォーマットを使用したい:

$start_date = date('Y-m-d', strtotime('yesterday')); 
$end_date = date('Y-m-d', strtotime('yesterday')); 

を、過去30日間、あなたは今日30日前に開始および終了したいです:

$start_date = date('Y-m-d', strtotime('30 days ago')); 
$end_date = date('Y-m-d'); 

開始日/終了日はこのようにすることができます。私はstrtotime()を使用していますので、多くの英語のフレーズを使って日付の算術演算を行う必要がなく、タイムスタンプを指定できます。また

、あなたが複数回クエリを実行されるので、それはおそらく、独自の関数にロジックを分離するために理にかなって:(最後の30日間で

function report_range($htG, $start_date, $end_date) { 
    $query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type"); 

    while ($result = mysql_fetch_assoc($query)){ 
     echo $start_date . '-' . $end_date . '/' . $result['type'] . ' = ' . $result['count(*)']; 
     echo '<br>'; 
    } 
} 
その後

このような何かでそれを実行しますこの例):

report_range($htG, date('Y-m-d', strtotime('30 days ago')), date('Y-m-d')); 
+0

私は4つの異なる結果を表示します。今日、昨日、先月、そして昨年。だから私は、PHPを使用して日付を並べ替えると思ったのです。何をお勧めしますか? –

+0

代わりに、読みやすくするために 'WHERE date BETWEEN '$ start_date' AND '$ end_date''を使用することもできます。 –

+1

@DanielHunter、今日、昨日、そして過去30日間のやり方を示す例を追加しました。今年は365日という意味ですか?もしそうなら、365と同じフォーマットを使用することができます。 –

関連する問題