2011-11-30 41 views
0

我目前的投票值与“投票”表免受“故事”表文章总结获得“最精彩的文章。”如何从数据库中选择日,周,月,年的信息?

当前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个(今天,上周,每月,每年)不同的查询或部分。

回答

1
$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" 
+0

@Ilya Knaup一个好主意:它的工作原理? –

+0

嗨$ date4有365天,如果有366天,这有什么关系吗?我的意思是它会搞砸了还是很好?日Thnx为真棒ANS)) – Ilja

+0

根据http://www.compshack.com/sql-plsql/find-number-days-year:'ADD_MONTHS(TRUNC(SYSDATE, 'Y'),12)-TRUNC(SYSDATE, 'Y')'。我不试试它是否有效。也许在PHP中更容易。 –

1
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") 
1

快速修正一些上述问题的答案。我相信OP正在寻找AVG()而不是SUM(),因为可能有1000票与1值和100与5,所以要获得最高评价,你需要AVG。要获得“最常见的评分”,你可以做COUNT()。 SUM()本身实际上并没有告诉你很多。 200x5 = 1000x1 = 300x3 + 100X1

如果更改st_date到时间戳,你也可以在除了其他的解决方案中提到的其他日期函数使用TIMESTAMPDIFF。改变之日起,以月或年和 1月/年或刚刚离开的日子,做365分之30

$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" 

而且,上面的查询让你内创建的收视率最高的文章期望的时期。如果您决定看的时间内收视率最高的文章,当它们被创造NO MATTER,改变你的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" 

匹配投票日期您可以结合这两种物品的创建和一个查询中也投票期。

最后但并非最不重要的一点,您应该将'date'列的名称更改为vote_date之类的其他名称。日期是一个保​​留字,它不使用,对列名

相关问题