一个 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 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

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

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

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