2013-08-21 91 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'); 

這大概是你能做到這一點的方法之一,但你總是可以自定義上面的代碼按你的舒適性的因素。

相關問題