1

URLのヒットを記録するテーブルがあります

目標は、日ごとにグループ化されたすべてhitsを取得することですparent

parentURLのIDを表す

timePHPによって生成されたintですtime()

id | parent | time

これまでに思いついたクエリ: ( item を選択したいと仮定します2929)

SELECT time, count( * ) AS hits
FROM `hits`
WHERE parent =2929
GROUP BY floor( time /86400 )
ORDER BY time ASC

今の問題は、5行しか得られないことです

time            hits
1355761244      9
1355791721      22
1355879697      23
1355966014      16
1356070906      24

MySQL は 0 ヒットの日を返さないためです。

どうすればこれを修正できますか?

目標は、たとえば、過去 7 日間、30 日間、または 365 日間を選択し、0ヒットした日数も選択することです。

先月の日を選択するように更新されたクエリ:

SELECT floor(time/86400) AS day, count( * ) AS hits
FROM `hits`
WHERE parent =2929
AND time > ONE_MONTH_AGO
GROUP BY day
ORDER BY time ASC
LIMIT 0 , 30

Pharaoh の PHP 関数では、これは正常に動作するはずです。

4

2 に答える 2

2

ヒットのない日にはヒットがないため、この日のデータベース エントリはありません。そのため、MySQL は何も選択できません。
クエリが完了した後、PHPでこれを行います(「穴を埋める」)。

次のようなデータ後処理を行います。

for ($day=$minday; $day<=$maxday; $day++)
  if (!isset($sql_array[$day]))
    $sql_array[$day]=0;

echoまたは、データの ing中に直接実行します。

for ($day=$minday; $day<=$maxday; $day++)
  if (!isset($sql_array[$day]))
    echo 0;
  else
    echo $sql_array[$day];

日数を数える整数であると仮定$dayしました。必要に応じて変更する必要があります。

于 2012-12-22T13:52:16.820 に答える
1

開始日と終了日をタイムスタンプの形式で設定し、PHP の range() 関数を使用してそれらのタイムスタンプの配列を作成します。配列の値をゼロに設定してから、クエリ結果セットを配列にマップします。ゼロの配列を取得するには、このようなものです。

<?php // RAY_temp_foo.php
error_reporting(E_ALL);
date_default_timezone_set('America/Chicago');

$old = strtotime('September 15, 2012');
$now = strtotime('October 15, 2012');
$day = 60*60*24;
$arr = range($old, $now, $day);
$new = array_flip($arr);
foreach ($new as $key => $nul) $new[$key] = 0;
var_dump($new);

「時間」の値を正規化して、配列内のキーに合わせて、各日の開始秒を表す必要がある場合があります。

于 2012-12-22T14:02:08.137 に答える