做项目的时候遇到一个问题,但又不想写代码去实现,因为遵循一个原则:能用SQL语句尽量不写代码。
例子:
A表(cid)
B表(cid, cnum)
A表cid会重复,把相同的分组统计出现次数出来,再存入B表对应的cnum,B表的cid不重复。
MySQL语句:
UPDATE b
SET b.`cnum` = (SELECT c.counts
FROM
(SELECT
cid,
COUNT(*) counts
FROM a
GROUP BY cid) c
WHERE b.`cid` = c.`cid`);
实际情景:
因为项目新增了一个功能,所以要相关的数据同步,便使用MySQL语句来解决。
think_orders(order_id, price, residue) 省略N个字段......
think_take_log(order_id, take)
订单是一个红包,别人领取到对应减少剩余的金额,但之前功能上没有做,所以现在补上,相关数据要同步,需要把数据更新下再同步功能上去。
# 更新剩余金额
UPDATE `think_orders` o
SET o.`residue` = o.`price` - IFNULL((SELECT tl.`sum`
FROM (SELECT
`order_id`,
SUM(`take`) `sum`
FROM `think_take_log`
GROUP BY `order_id`) tl
WHERE o.`order_id` = tl.`order_id`), 0);
用到的MySQL函数:ISNULL(字段名, 默认值)
因为可能有的红包未被领取,即take_log中无记录,统计出来的数据为空了会出错,所以要ISNULL判断处理一下结果。