菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
2914
1

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

原创
05/13 14:22
阅读数 2064

今天需要统计一个数据最后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却不可以。

发表评论

0/200
2914 点赞
1 评论
收藏
为你推荐 换一批