PHP MySQL查询在过去24小时内最受欢迎。

9

假设我想获取最近24小时内点赞数最多的十条记录。这是我目前的代码:

$date = date("o-m-d");
$query = "SELECT date_created,COUNT(to),from,to FROM likes WHERE date_created LIKE '$date%' GROUP BY to ORDER BY COUNT(to) DESC LIMIT 10";

问题在于,它只获取当天最受欢迎的内容,无论当天已经过去多久。它不会获取过去24小时内最受欢迎的内容。

喜欢的结构:来自|到|创建日期|标识符

日期采用标准的ISO时间格式-例如2010-07-14T00:35:31-04:00。直接来自PHP参考:date(“c”);


我的数据类型是varchar,现在该怎么办... - Bharanikumar
4个回答

19
WHERE date_created > DATE_SUB( NOW(), INTERVAL 24 HOUR)

@Dave Rix 欢迎来到stackoverflow。 :) - George Marian
1
您还可以使用算术运算符,例如 NOW() - INTERVAL 24 HOUR - Aley

2
如果你的date_created字段是一个datetime或timestamp类型的字段,你可以在where子句中使用DATE_SUB如下;

WHERE date_created > DATE_SUB(NOW(), INTERVAL 24 HOUR)


1
你应该使用日期/时间函数,而不是 LIKE。
WHERE date_created >= (NOW() - INTERVAL 24 HOUR)

@haim evgi 是的,我在提交答案后注意到了那个错误。 :) - George Marian
好的回答,但有一个问题:我们应该在 PHP 中处理时间,而不是 MySQL。 - Narcis Radu
@narcisradu 为什么会这样? - George Marian
  1. 如果SQL服务器和PHP位于两台不同的机器上,则时间数据将不再准确。
  2. 如果数据库服务器位于另一个时区,则事情开始失去同步。
- Narcis Radu
@narcisradu 当然,但这些都是情境性的。你至少可以将服务器上的时间同步到几秒钟以内。如果这几秒钟会有影响,你需要处理它;可能就像你所建议的那样。对于第二点也是如此,这是相当不寻常的。 - George Marian
1
应该是 INTERVAL 24 HOUR 而不是 24 HOURS。 - rjha94

1
首先,date_created 应该被定义为一个带有 "default current timestamp" 的时间戳。如果表中还有 date_modified 字段,那么 date_modified 会使用 "on update current timestamp" 并且你可以将 date_created 定义为一个时间戳,并使用触发器来更新它。
CREATE TRIGGER likes_date_entered
BEFORE INSERT ON likes
FOR EACH ROW SET NEW.date_created = NOW()

现在我们有了一个时间戳,您可以轻松地将一些mysql日期函数应用于该列。

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

我会把该怎么做留给读者作为练习,除非你说“拜托”并想让我给出精确的语法。


只要更改数据类型,George或Hami的条件就会起作用。 - umassthrower
你知道的,我的答案更好 :-P 在 PHP 中计算时间戳是一个不好的主意:“日期是标准的 ISO 时间 - 例如 2010-07-14T00:35:31-04:00。直接从 PHP 参考手册中获取:date("c");” - umassthrower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接