0

合計、今日、昨日、週、月、年ごとに記事のビューを追跡しています。それに応じて並べ替えたいと思い
ます。ID が記事である各値を追跡するビュー テーブルがあります。

MYSQL ヒット テーブル

特定の記事が表示されると、Total、Today、Week、Month、Year の値を増やします。
ここまでは順調です
が、明日の朝になったら、どのように集計するのが一番良いでしょうか?..

例: 昨日の今日の列を昨日の列にコピーする必要があり、週が変更された場合は、すべての行を削除する必要があります。 in Week (それに応じて月と年も) -

日/週/月/年を追跡する別のテーブルを作成し、それを PHP と比較して、PHP で変更を加えることができることはわかっていますが、おそらく私が気付いていないより良い方法はありますか? MYSQL キャッシング、cronjobs か何か?..

4

1 に答える 1

0

サイトが 1 日ダウンしたらどうなりますか? データベースの壊れた進行を修正するのは誰ですか? 1 月 31 日 (日) に更新を見逃した場合はどうなりますか? すべての値がオフになり、それを修正して楽しんでください。

ビュー カウントは1か所にのみ保存し、必要に応じてそのデータを操作する必要があります。

あなたが持つべきテーブル構造:

TABLE Articles
  ID INT PK
  ...

TABLE Viewcount
  Date        DATE  PK
  Article_ID  INT   PK
  NumViews    INT

再生回数を更新するには:

INSERT INTO Viewcount (Date, Article_ID, NumViews)
  VALUES(TODAY(), 12345, 1)
  ON DUPLICATE KEY UPDATE NumViews=NumViews+1

そして、カウントを取得するには:

SELECT ar.ID,
  today.numviews as 'today',
  yesterday.numviews as 'yesterday',
  thisweek.sum as 'week',
  thismonth.sum as 'month',
  thisyear.sum as 'year',
  alltime.sum as 'alltime'
FROM Articles ar LEFT JOIN (
  SELECT Article_id, NumViews
  FROM Viewcount
  WHERE Date = TODAY()
) 'today'
ON ar.ID = today.Article_ID
LEFT JOIN (
  SELECT Article_id, NumViews
  FROM Viewcount
  WHERE Date = DATE_SUB(TODAY(), INTERVAL 1 DAY)
) 'yesterday'
ON ar.ID = yesterday.Article_ID
LEFT JOIN (
  SELECT Article_id, SUM(NumViews) 'sum'
  FROM Viewcount
  WHERE YEAR(Date) = YEAR()
    AND WEEK(Date) = WEEK()
  GROUP BY Article_ID
) 'thisweek'
ON ar.ID = thisweek.Article_ID
LEFT JOIN (
    SELECT Article_id, SUM(NumViews) 'sum'
  FROM Viewcount
  WHERE YEAR(Date) = YEAR()
    AND MONTH(Date) = MONTH()
  GROUP BY Article_ID
) 'thismonth'
ON ar.ID = thismonth.Article_ID
LEFT JOIN (
    SELECT Article_id, SUM(NumViews) 'sum'
  FROM Viewcount
  WHERE YEAR(Date) = YEAR()
  GROUP BY Article_ID
) 'thisyear'
ON ar.ID = thisyear.Article_ID
LEFT JOIN (
    SELECT Article_id, SUM(NumViews) 'sum'
  FROM Viewcount
  GROUP BY Article_ID
) 'alltime'
ON ar.ID = alltime.Article_ID

または、フェッチしたい期間に対してプログラムで各クエリを実行するだけです。

于 2013-01-07T19:17:24.237 に答える