一个 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 协议》,转载必须注明作者和本文链接
推荐文章: