[英]How to select information from database that is day, week, month, year old?
我目前正在通過將“投票”表中的投票值與“故事”表中的文章相加得出“最高評價的文章”。
當前的PHP查詢:
$sql = mysql_query("SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10") or die (mysql_error("There was an error in connection"));
數據庫結構:
故事表:
投票表:
但是我想知道如何在不同的時間段內顯示信息。 說出收視率最高的文章“今天”,“上周”,“上個月”,“去年”。 基於“故事”表中的文章創建日期st_date 。 我只需要負責在不同時間段內獲取數據的這4個(今天,上周,月,年)不同的查詢或部分。
SELECT stories.*, SUM(votes.vote_value) as 'total_votes'
FROM stories
JOIN votes
ON stories.id = votes.item_name
WHERE (
(st_date BETWEEN (NOW(), DATE_SUB(NOW(), INTERVAL 7 DAY))
OR
(st_date BETWEEN (DATE_SUB(NOW(), INTERVAL 14 DAY, DATE_SUB(NOW(), INTERVAL 7 DAY))
)
GROUP BY stories.id
ORDER BY total_votes DESC LIMIT 10")
$date1 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) = 0";
$date2 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) <= 7";
$date3 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) <= 31";
$date4 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) <= 365";
$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date1." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date2." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date3." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date4." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
快速糾正上述某些答案。 我相信OP正在尋找AVG()而不是SUM(),因為可能有1000張1票和100張5票,所以要獲得最高評分,您需要AVG。 要獲得“最頻繁的評分”,您需要執行COUNT()。 SUM()本身並不能告訴您太多信息。 200x5 = 1000x1 = 300x3 + 100x1
如果將st_date更改為timestamp,則除了其他解決方案中提到的其他日期函數外,還可以使用timestampdiff。 將“ DAY”更改為“ MONTH”或“ YEAR”,將<7更改為<1以表示月/年,或者僅將其保留幾天,然后執行30/365
$query = "SELECT stories.*, AVG(votes.vote_value) as 'total_votes'
FROM stories JOIN votes ON stories.id = votes.item_name
WHERE abs(timestampdiff(DAY, stories.st_date, NOW())) < 7
GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
另外,以上查詢為您提供了在您希望的時間內創建的評分最高的文章。 如果您決定在創建時在無條件的時期內查看收視率最高的文章,請更改where子句以匹配投票日期
$query = "SELECT stories.*, AVG(votes.vote_value) as 'total_votes'
FROM stories JOIN votes ON stories.id = votes.item_name
WHERE abs(timestampdiff(DAY, votes.date, NOW())) < 7
GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
您也可以在一個查詢中結合文章創建和投票期。
最后但並非最不重要的一點是,您應該將“日期”列的名稱更改為vote_date。 日期是保留字,將其用作列名不是一個好主意
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.