MYSQL PHP基于日期统计列

MYSQL PHP基于日期统计列,php,mysql,Php,Mysql,我按总浏览量、今天浏览量、昨天浏览量、周浏览量、月浏览量和年浏览量对文章进行跟踪,并对它们进行相应的排序 我有一个跟踪每个值的视图表,ID为文章: 当一篇特定的文章获得一个视图时,我会将一个值增加到Total、day、Week、Month和Year到目前为止还不错。 但当明天早上到来时,什么是最好的总结方式 例如:我需要获取昨天的“今天”列并复制到“昨天”列,如果周已更改,我需要删除周中的所有行(也相应删除月份和年份)- 我意识到我可以创建另一个表来记录它是哪一天/wk/mnth/yr,并将其

我按总浏览量、今天浏览量、昨天浏览量、周浏览量、月浏览量和年浏览量对文章进行跟踪,并对它们进行相应的排序
我有一个跟踪每个值的视图表,ID为文章:

当一篇特定的文章获得一个视图时,我会将一个值增加到Total、day、Week、Month和Year
到目前为止还不错。
但当明天早上到来时,什么是最好的总结方式

例如:我需要获取昨天的“今天”列并复制到“昨天”列,如果周已更改,我需要删除周中的所有行(也相应删除月份和年份)-


我意识到我可以创建另一个表来记录它是哪一天/wk/mnth/yr,并将其与PHP进行比较,然后使用PHP进行更改,但是有没有更好的方法,也许我不知道?MYSQL缓存、cronjobs或其他什么?。

如果您的站点停机一天会发生什么?谁修复了数据库中损坏的进程?如果1月31日(星期日)的更新被错过怎么办?你所有的价值观都将被关闭,并享受修复它的乐趣

您应该只在一个位置存储视图计数,并根据需要处理该数据

您应该具有的表结构:

TABLE Articles
  ID INT PK
  ...

TABLE Viewcount
  Date        DATE  PK
  Article_ID  INT   PK
  NumViews    INT
要更新viewcount,请执行以下操作:

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

或者只需针对您想要获取的时段以编程方式执行每个查询。

我认为您不会在这里找到灵丹妙药。你所描述的几乎就是需要发生的事情。如果您想在MySQL中完成这一切,请查看
CREATE EVENT
,了解如何安排定期运行。一段时间后,表Viewcount是否会变得非常大?@jc6212从技术上讲是的,但每篇文章每天只有一行,而且只有在文章至少被浏览一次的情况下。此外,每行仅由大约3个字节组成。从这个角度来看,要使该表以每年1MB的速度增长,您需要每天至少点击958篇文章。