我正在通过Total,Today,Yesterday,Week,Month和Year跟踪文章视图,我想相应地对它们进行排序 我有一个跟踪每个值的视图表,ID是文章:
当特定文章获得视图时,我将值增加到Total,Today,Week,Month和Year。
到目前为止很好..
但明天早上来的时候,最好的计算方法是什么?...
例如:我需要使用昨天的今日专栏并复制到昨天列,如果周已更改,我需要删除周中的所有行(也相应地按月和年) -
我意识到我可以创建另一个表来跟踪它/ wk / mnth / yr的日期并将其与PHP进行比较,然后使用PHP进行更改,但有没有更好的方法,也许我不知道? MYSQL缓存,cronjobs还是什么?..
答案 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
或者只是以编程方式为您想要获取的时段执行每个查询。