MYSQL PHP根据日期计算列

时间:2013-01-07 18:56:48

标签: php mysql

我正在通过Total,Today,Yesterday,Week,Month和Year跟踪文章视图,我想相应地对它们进行排序 我有一个跟踪每个值的视图表,ID是文章:

MYSQL HIT TABLE

当特定文章获得视图时,我将值增加到Total,Today,Week,Month和Year。
到目前为止很好..
但明天早上来的时候,最好的计算方法是什么?...

例如:我需要使用昨天的今日专栏并复制到昨天列,如果周已更改,我需要删除周中的所有行(也相应地按月和年) -

我意识到我可以创建另一个表来跟踪它/ wk / mnth / yr的日期并将其与PHP进行比较,然后使用PHP进行更改,但有没有更好的方法,也许我不知道? MYSQL缓存,cronjobs还是什么?..

1 个答案:

答案 0 :(得分:0)

如果您的网站停用一天会怎样?谁修复了数据库中破碎的进展?如果在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

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