一个 MySQL sql 语句执行顺序带来的 bug

今天需要统计一个数据最后3条数据的总和

一开始打算这样实现,却忽略了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却不可以。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

file
这里是少了一个$了吗?

7年前 评论
xiao (楼主) 7年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!