有三张表:
tbl_order
id 订单ID
uid 用户ID
need_credit 订单所需积分
status 订单状态
....
tbl_coupon
id
uid
used_order 优惠码所使用到的order.id
used 0:未使用/1:已使用/2:已标记为不可用
....
tbl_member
id 用户ID
credit 用户积分
....
条件:传入$order_id
把tbl_order中
id = {$order_id}
的status标记为2
把tbl_coupon中
used = 2 AND used_order = {$order_id}
的 used标记为0, used_order 标记为 ""
把tbl_member中
id = tbl_order.uid /* 这里的tbl_order.uid是上面tbl_order.id={$order_id}那条数据的tbl_order.uid */
的 credit += tbl_order.need_credit
需要由一句SQL来完成
请教了老师,用储存过程来分步实现了这个需求。
存储过程就是将若干sql封装成的一个用来调用的“函数”
虽然已经可以暂时告一段落,仍然期待着更完美的方案...
阿神2017-04-17 11:26:11
已測:
update tbl_order as a, tbl_coupon as b, tbl_member as c set a.status = 2, b.used = 0, b.used_order = '', c.credit = (c.credit + a.need_credit) where a.id = {$order_id} and b.used = 2 and b.used_order = {$order_id} and c.id = a.uid
有一個疑問,上述 mysql
語句的邏輯是使用者的退單動作嗎,恢復使用過的優惠券,回饋使用者使用過的積分,然後修改訂單的狀態。
迷茫2017-04-17 11:26:11
update table1 as a, table2 as b, table3 as c
set a.status = ..., b.used = ..., c.used_order = ...
where 条件
容易忽略的地方應該是在最開始的update
中將要用到的幾張表全部都引入。
阿神2017-04-17 11:26:11
個人認為題主老師給的答案不是很可靠
這個東西用儲存過程無錯,但是眾所周知儲存過程挺耗mysql資源,維護起來也比較難
你描述的東西,其實是個完整的事務,
用mysql的事務去實作吧
不知道你用的是那種程式語言,總之應該都有支援事務的方法。