文章都是前一天晚上抽出固定时间写,第二天定点8:00准时推送,记录每日所学,所想,持续输入输出,不断分享,提升自己。
最近在写sql,要让两个表中结果值字段相加,首先我的sql如下:
SELECTIFNULL( FIRST, 0 ) + IFNULL( SECOND, 0 ) AS 订单总金额FROM(SELECT*FROM(SELECTsum( osi.price * ( osi.notInC2MQuantity + osi.amountReturnQuantity ) ) AS FIRSTFROMorder_sale osINNER JOIN order_sale_item osi ON os.id = osi.orderSaleIdWHEREos.mallId = 11AND os.payType = 4AND os.buyerType = 3AND os.state = 5AND ( osi.notInC2MQuantity > 0 || osi.amountReturnQuantity > 0 )) AS a,(SELECTsum( osi.price * osi.quantity ) AS SECONDFROMorder_sale osINNER JOIN order_sale_item osi ON os.id = osi.orderSaleIdWHEREos.mallId = 11AND os.payType = 4AND os.buyerType = 3AND os.state IN ( 3, 4 )) AS b) c
第一步先把其中一个表的数据取出来,取名为a 第二步把另外一个表的数据取出来,取名为b 第三步把这两个表最为一个临时表取名为c 然后把临时表两列字段相加
以上sql虽然也可以得出结果,但是sql的可读性太差了。那有没有其他的方法呢?问了下后端,可以用union对两个表结果组合到一个结果集。查了下union官方的语法如下:
MySQL UNION 操作符语法格式:SELECT expression1, expression2, ... expression_nFROM tables[WHERE conditions]UNION [ALL | DISTINCT]SELECT expression1, expression2, ... expression_nFROM tables[WHERE conditions];
expression1, expression2, ... expression_n: 要检索的列。 tables: 要检索的数据表。 WHERE conditions: 可选, 检索条件。 DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。 ALL: 可选,返回所有结果集,包含重复数据。
SELECTsum( amount ) AS 订单总金额,sum( quantity ) AS 订单总数量FROM(SELECTsum( osi.price * ( osi.notInC2MQuantity + osi.amountReturnQuantity ) ) AS amount,count( DISTINCT sn ) AS quantityFROMorder_sale osINNER JOIN order_sale_item osi ON os.id = osi.orderSaleIdWHEREos.mallId = 11AND os.payType = 4AND os.buyerType = 3AND os.state = 5AND ( osi.notInC2MQuantity > 0 || osi.amountReturnQuantity > 0 ) UNIONSELECTsum( osi.price * osi.quantity ) AS amount,count( DISTINCT sn ) AS quantityFROMorder_sale osINNER JOIN order_sale_item osi ON os.id = osi.orderSaleIdWHEREos.mallId = 11AND os.payType = 4AND os.buyerType = 3AND os.state IN ( 3, 4 )) AS result2
上面的sql相比前一个是不是很清晰,一眼就看出是对两个表结果组合一个结果集,然后对这个结果集的两列字段求和。
如果文章对你有帮助,可以关注我,已坚持日更10/365
文章转载自麦子酱OvO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




