laravel 中MySQL臨時表使用


MySQL原生語句

顧客分析-消費次數分析

select
  sum(if(tmp.pay_number =1,1,0)) as frequency_1,
  sum(if(tmp.pay_number = 1,tmp.pay_number,0)) as frequency_1_number,
  sum(if(tmp.pay_number >=2 and tmp.pay_number <=8,1,0)) as frequency_2,
  sum(if(tmp.pay_number >=2 and tmp.pay_number <=8,tmp.pay_number,0)) as frequency_2_number,
  sum(if(tmp.pay_number >=9 and tmp.pay_number <=15,1,0)) as frequency_3,
  sum(if(tmp.pay_number >=9 and tmp.pay_number <=15,tmp.pay_number,0)) as frequency_3_number,
  sum(if(tmp.pay_number >15,1,0)) as frequency_4,
  sum(if(tmp.pay_number >15,tmp.pay_number,0)) as frequency_4_number,
  count(*) as frequency_total,
  sum(tmp.pay_number) as frequency_number_total
from (

  select
    t.membership_id,
    count(*) as pay_number,
    sum(t.receivable) sum_receipts
  from transactions t
  where t.end_time >= '2018-05-01'
        and t.end_time <= '2018-05-31 23:59:59'
        and t.membership_id > 0
//         and t.pay_way = 1
        and t.business_id = 9
  group by t.membership_id

) tmp;

laravel 中的代碼

 //根據會員ID分組,得出一個月此商戶會員數,各個會員支付的筆數,以及每個會員的總金額
        $tmp = $transaction->selectRaw('membership_id,count(*) as pay_number,sum(receivable) as sale_amount')
                            ->whereBetween('end_time',[$start_time,$end_time])
                            ->where('membership_id','>',0)
                            ->where('business_id','=',$businessId) //當前商戶
                            ->where('status','=',1)//交易狀態為:成功
                            ->groupBy('membership_id'); //根據用戶會員分組
        //根據上面的數據再獲得相應次數下的各個用戶數,支付筆數,金額數
        $v = \DB::table(\DB::raw("({$tmp->toSql()}) as t"))
            ->mergeBindings($tmp->getQuery())
            ->selectRaw('sum(if(t.pay_number =1,1,0)) as frequency_1_custombers,
                                    sum(if(t.pay_number = 1,t.pay_number,0)) as frequency_1_pay_number,
                                    sum(if(t.pay_number = 1,t.sale_amount,0)) as frequency_1_sale_amount,
                                    sum(if(t.pay_number >=2 and t.pay_number <=8,1,0)) as frequency_2_8_custombers,
                                    sum(if(t.pay_number >=2 and t.pay_number <=8,t.pay_number,0)) as frequency_2_8_pay_number,
                                    sum(if(t.pay_number >=2 and t.pay_number <=8,t.sale_amount,0)) as frequency_2_8_sale_amount,
                                    sum(if(t.pay_number >=9 and t.pay_number <=15,1,0)) as frequency_9_15_custombers,
                                    sum(if(t.pay_number >=9 and t.pay_number <=15,t.pay_number,0)) as frequency_9_15_pay_number,
                                    sum(if(t.pay_number >=9 and t.pay_number <=15,t.sale_amount,0)) as frequency_9_15_sale_amount,
                                    sum(if(t.pay_number >15,1,0)) as frequency_15_custombers,
                                    sum(if(t.pay_number >15,t.pay_number,0)) as frequency_15_pay_number,
                                    sum(if(t.pay_number >15,t.sale_amount,0)) as frequency_15_sale_amount,
                                    count(*) as total_custombers,
                                    sum(t.pay_number) as total_pay_number,
                                    sum(t.sale_amount) as total_sale_amount
                                    ')
            ->first();
// 合並綁定參數
$query->mergeBindings($subQuery);
OR
$query->mergeBindings($subQuery->getQuery());

\DB::table(\DB::raw('('.$subQuery.') as tt'))

注意合並參數時 $subQuery 必須是 \Illuminate\Database\Query\Builder 類型
如果是 \Illuminate\Database\Eloquent\Builder 類型的,用 getQuery() 方法

不用 DB::raw() 直接寫子查詢,是因為查詢帶比較多的 where 條件和 group by, 而且內層查詢和外層查詢的 where 基本是一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM