搜尋

首頁  >  問答  >  主體

MYSQL多表更新

有三张表:

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封装成的一个用来调用的“函数”
虽然已经可以暂时告一段落,仍然期待着更完美的方案...

伊谢尔伦伊谢尔伦2786 天前638

全部回覆(4)我來回復

  • 阿神

    阿神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 語句的邏輯是使用者的退單動作嗎,恢復使用過的優惠券,回饋使用者使用過的積分,然後修改訂單的狀態。

    回覆
    0
  • 迷茫

    迷茫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中將要用到的幾張表全部都引入。

    回覆
    0
  • 阿神

    阿神2017-04-17 11:26:11

    個人認為題主老師給的答案不是很可靠
    這個東西用儲存過程無錯,但是眾所周知儲存過程挺耗mysql資源,維護起來也比較難

    你描述的東西,其實是個完整的事務,
    用mysql的事務去實作吧
    不知道你用的是那種程式語言,總之應該都有支援事務的方法。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 11:26:11

    雷雷

    回覆
    0
  • 取消回覆