900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Mysql里where语句里不能使用SUM聚合函数筛选怎么办?

Mysql里where语句里不能使用SUM聚合函数筛选怎么办?

时间:2018-08-20 02:59:27

相关推荐

Mysql里where语句里不能使用SUM聚合函数筛选怎么办?

现有这样一个需求:

在一个电商订单管理平台中,我想查看所有已付款订单中,哪些订单是有部分退款的。

一开始思路是这样是没错的:

在订单详情表里的num数量和大于退款详情表里的num数量之和即可,也就是SUM(nums)>SUM(num)。

为了达成这样的目的,我一开始在MySql里直接这样运行了,代码如下:

SELECT soo.order_bn, sooi.order_id,sooi.nums,sori.numfrom sdb_ome_orders soo left join sdb_ome_order_items sooi on sooi.order_id = soo.order_id left join sdb_ome_reship sor on sor.order_id = soo.order_id left join sdb_ome_reship_items sori on sori.reship_id = sor.reship_id WHERE soo.shop_id = '52759ae5ccd9d10b9ad763cb78ec2c77'and SUM(sooi.nums) > SUM(sori.num);

但是运行的结果发生了如下报错:

SQL Error [1111] [HY000]: Invalid use of group function。

单独注释掉最后一条,运行其他的是可以出来结果的。

所以where语句后面是不能使用sum聚合函数的,怎么办呢?

你可以单独用订单表连接订单明细表,把查询出来的结果定义为表A,将A里的nums求和设为a,

然后用订单表连接退款明细表,将查询出来的结果定义为表B,将B里的num求和设为b,然后再where语句中进行筛选对比即可。

完整代码如下:

SELECT * FROM (SELECT order_bn,sooi.bn,sum(sooi.nums) as bFROM sdb_ome_orders sooleft join sdb_ome_order_items sooi on soo.order_id = sooi.order_id WHERE soo.shop_id = '52759ae5ccd9d10b9ad763cb78ec2c77'group by order_bn ,sooi.bn) AS sooileft join (select order_bn,sori.bn,sum(sori.num) as a from sdb_ome_orders sooleft join sdb_ome_reship sor on sor.order_id = soo.order_id left join sdb_ome_reship_items sori on sori.reship_id = sor.reship_id WHERE soo.shop_id = '52759ae5ccd9d10b9ad763cb78ec2c77'group by order_bn ,sori.bn) as sor on sooi.order_bn=sor.order_bn where b>aand sooi.bn=sor.bnlimit 100;

运行结果如下(查询时间稍微长一点):

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。