一個 MySQL sql 語句執行順序帶來的 bug

xiao發表於2019-05-27

一開始打算這樣實現,卻忽略了mysql會先統計sum,再執行limit

$totleForfeit = ForfeitModel::where('user_id', $userId)
                        ->select('amount')
                        ->orderBy('id', 'DESC')
                        ->limit(3)
                        ->sum('amount');

後面改成這樣

$forfeitDetail = ForfeitModel::where('user_id', $userId)
                        ->orderBy('id', 'DESC')
                        ->limit(3)
                        ->get(['amount']);

$totleForfeit = forfeitDetail->sum('amount');

複習一下mysql執行順序

1、from子句組裝來自不同資料來源的資料;

2、where子句基於指定的條件對記錄行進行篩選;

3、group by子句將資料劃分為多個分組;

4、使用聚集函式進行計算;

5、使用having子句篩選分組;

6、計算所有的表示式;

7、select 的欄位;

8、使用order by對結果集進行排序。

9、執行limit

這裡還有個疑問,求大佬們答疑解惑

明明 select 語句是在group和having後面執行, 
為什麼group和having語句卻能使用 select裡面的別名呢? where卻不可以。

相關文章