从同一个表但不同的时间帧检索数据的最佳方法是什么?

时间:2013-08-21 15:50:41

标签: php mysql sql laravel

我只是不确定如何处理这个问题。这是我必须输出的信息:

output

最好的方法是什么?我有一个名为“付款”的表和一个名为“referral_earnings”的表(示例)。

付款:
user_id | type (file or link) | amount | created_at (DATETIME)

referral_earnings:
user_id (user receiving the payment) | amount | created_at

我将缓存X分钟查询的结果。我只是不确定创建查询的最佳方法吗?我正在努力的部分是不同的时间框架。

谢谢!

编辑:好的,我现在遇到的问题是区分同一查询中的文件,链接和引荐

答案:https://stackoverflow.com/a/18362989/1073419

4 个答案:

答案 0 :(得分:2)

使用Query Scope。它们非常方便

class Stats extends Eloquent{

      public function scopefileStats($query, $timeFrame){
            $query->where('user_id', = ,Auth::user()->id);
            $query->where('created_at','>', DB::raw($timeFrame));
            $query->where('type','=','FILE');
      }

      public function scopelinkStats($query,$timeFrame){
            $query->where('user_id', = ,Auth::user()->id);
            $query->where('created_at','>', DB::raw($timeFrame));
            $query->where('type','=','LINK');
      }

      public function scopereferralStats($query,$timeFrame){
            $query->where('user_id', = ,Auth::user()->id);
            $query->where('created_at','>', DB::raw($timeFrame));
            $query->where('type','=','REFERRAL');
      }
}

将数据检索为

Stats::fileStats('date_sub(NOW(), INTERVAL 1 MONTH)')->sum('amount');
Stats::linkStats('date_sub(NOW(), INTERVAL 1 MONTH)')->sum('amount');
Stats::referralStats('date_sub(NOW(), INTERVAL 1 MONTH)')->sum('amount');

这可能是您可以执行此操作的方法之一,但您始终可以根据舒适因素自定义上述代码。

答案 1 :(得分:0)

可能你可以使用Mysql日期/时间函数,

created_at > date_sub(NOW(), INTERVAL 1 MONTH) // for last month
created_at> date_sub(NOW(), INTERVAL 7 DAY) // for last week
created_at> date_sub(NOW(),INTERVAL 1 DAY) // for yesterday

答案 2 :(得分:0)

编写查询(存储过程 - 假设您与mysql配对)并在每次需要从这些表中获取数据时调用该查询(存储过程)。将您的日期时间作为参数传递给存储过程。根据您的需要,您甚至可以在您使用的任何数据库中使用内置的“getDateTime”函数,以避免传递日期时间。

我只是重读了原帖 - 你实际上也传递了其他变量的参数(userid)。

答案 3 :(得分:0)

这样做:

DB::select("
    SELECT
        SUM(IF(TYPE = 'file', conversions.user_payout, 0)) AS files,
        SUM(IF(TYPE = 'link', conversions.user_payout, 0)) AS links,
        (SELECT 
            SUM(amount) FROM referral_earnings WHERE user_id = :user_id1 AND date_sub(NOW(), INTERVAL 7 DAY)
        ) AS referrals 
    FROM 
        conversions
    WHERE 
        conversions.user_id = :user_id2 
        AND date_sub(NOW(), INTERVAL 7 DAY)
", [
    'user_id1' => 3, 
    'user_id2' => 3
]);

感谢:
https://stackoverflow.com/a/18362519/1073419
https://stackoverflow.com/a/14906832/1073419

感谢所有帮助!