0

我正在按总计、今天、昨天、周、月和年跟踪文章视图,我想对它们进行相应的排序
我有一个跟踪每个值的视图表,ID 是文章:

MYSQL命中表

当特定文章获得浏览量时,我将值递增到 Total、Today、Week、Month 和 Year。
到目前为止一切都很好..
但是明天早上来的时候,最好的统计方法是什么?..

例如:我需要将昨天的今天列复制到昨天列,如果星期发生了变化,我需要删除所有行在周(也有相应的月份和年份) -

我意识到我可以制作另一个表格来跟踪它是哪一天/一周/一个月/一年,并将其与 PHP 进行比较,然后使用 PHP 进行更改,但有没有更好的方法,也许我不知道?MYSQL 缓存,cronjobs 什么的?

4

1 回答 1

0

如果您的网站关闭一天会怎样?谁修复了您数据库中损坏的进度?如果 1 月 31 日星期日错过更新怎么办?你所有的价值观都将消失,并享受修复它的乐趣。

您应该只将视图计数存储在一个地方,并操纵该数据以满足您的需求。

您应该具有的表结构:

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 回答