簡體   English   中英

如何從數據庫中選擇日,周,月,年的信息?

[英]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"));

數據庫結構:

故事表:

img1

投票表:

img2


但是我想知道如何在不同的時間段內顯示信息。 說出收視率最高的文章“今天”,“上周”,“上個月”,“去年”。 基於“故事”表中的文章創建日期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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM