每日帖子计数超出时间戳列

时间:2014-01-12 04:53:13

标签: php mysql laravel laravel-4

我的应用程序是使用Laravel 4.1构建的,并且几乎支持Laravel今天正式执行的所有数据库。我有一个INT(10)列,存储每个“post”的Unix时间戳,以指示帖子的创建时间。

有没有办法可以从这种设置中获得每日帖子数量?基本上,我想用Google Chart API制作一个图表,以表明过去1个月每天发布的帖子数量趋势。

另外,我正在寻找围绕DB :: raw()的解决方案,我更喜欢使用查询构建器。

2 个答案:

答案 0 :(得分:2)

如果要在数据库端IMHO上执行聚合,则必须使用DB::raw(),因为您需要操作时间戳值。

如果理解正确,您的主要问题不在于使用DB::raw()方法,而是不使用特定于供应商的日期时间函数(例如MySQL中的FROM_UNIXTIME())。

您可以发出这样的查询,以几乎与数据库无关的方式获取聚合结果(AFAIK所有主要DBMS都具有FLOOR()函数的实现)

SELECT FLOOR(timestamp / 86400) AS date , COUNT(*) AS total
  FROM post 
 GROUP BY FLOOR(timestamp / 86400)

使用查询生成器

转换为类似的内容
$result = DB::table('posts')
             ->select(DB::raw('FLOOR(timestamp / 86400) AS date, COUNT(*) AS total'))
             ->groupBy(DB::raw('FLOOR(timestamp / 86400) AS date, COUNT(*) AS total'))
             ->get();

示例输出:

|  DATE | TOTAL |
|-------|-------|
| 16081 |     2 |
| 16082 |     3 |

这是 SQLFiddle 演示

然后在客户端代码中将date列值转换为人类可读形式

date('m/d/Y', 16081 * 86400)
迭代结果集时

答案 1 :(得分:0)

首先,您应该使用Laravel的created_at和updated_at列的内置时间戳。如果您不想使用Laravel的内置时间戳,则至少应该将timestamp列设置为timestamp数据类型而不是int。

话虽如此,您可能想要用于此类内容的原始SQL看起来有点像;

SELECT DATE(timestamp_column_name) as day, count(*) as post_count from posts group by day order by day asc;

没有真正的,纯粹雄辩的方式来做到这一点。像下面这样的东西会尽可能接近你。

Post::groupBy('day')->get([
    DB::raw('DATE(FROM_UNIXTIME(timestamp_column_name)) as day'),
    DB::raw('count(*) as post_count')
]);

这将返回两列,day是YYYY-MM-DD格式的日期,post_count是带计数的整数。

===========

在上面的例子中,我使用的是MySQL DATE函数。您当然可以根据需要操纵时间戳列。这似乎对我来说最有意义。