2013-08-21 90 views
0

我只是有点不确定如何处理这个问题。这是我要输出的信息:从同一个表中检索数据的最佳方式是什么,但是时间段不同?

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

+1

我不会在一个查询中做到这一点,但许多查询:每个时间范围内都有一个查询。这是否有助于您提出解决方案? – Halcyon

+0

@FritsvanCampen是的,我当然可以做到这一点,但它只是感觉有点“浪费”。如果我这样做,最好为每个时间范围运行一个查询,然后SUM数量col? – Prash

+0

正如@FritsvanCampen所说,我相信这是实现它的最好方式。 –

回答

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 
+0

是的,但我怎么区分一个查询中的文件,链接和推介? – Prash

0

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

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

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

感谢所有帮助!

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'); 

这大概是你能做到这一点的方法之一,但你总是可以自定义上面的代码按你的舒适性的因素。

相关问题