作者JeremyJoung (J.J.)
看板Database
标题Re: [SQL ] update multiple-table 语法求教
时间Sun Aug 14 22:52:12 2016
※ 引述《jonce007》之铭言:
: Query OK, 0 rows affected (0.00 sec)
: Rows matched: 1 Changed: 0 Warnings: 0
: matched: 符合条件有1笔
: 因为要更改的值和原来一样,所以changed=0
: 先归零一下再跑:
: update pb1 set opi=0, oyd=0, okg=0;
: UPDATE pb1 join (select pbin, sum(opi) pi , sum(oyd) yd, sum(okg) kg from pb1
: where pbin='020417008' &&pbon<>'' group by pbin) AS pb2
^^^^^^^^^ 你这边强制限制了pbin的范围
这样会让整体运算没有意义
另外 MySQL中 Changed: 0 的意思是 虽然有比对到符合资料
但是卸入後不会有任何"实际"改变 所以就会忽略写入
而 你刚刚的动作已经把020417008写入过一次
之後的命令 也只会产生020417008的一笔结果 所以就会没有改变
另外 MySQL中在MULTI UPDATE中 有一个使用限制
那就是被改变的TABLE 不可以以SELECT的形式 出现在SUB-QUERY中
如果违反规则 就会具体吐出错误讯息
一般来说 都必须用JOIN来处理
但是 到底怎样的动作算是违反规则 我还抓不出具体范围
目前我只知道 WHERE IN(SELECT), SET=(SELECT) 这两个都不行
剩下的还没试过
但是 不是每种动作都会有这种冲突
: SET pb1.opi=pb2.pi
: , pb1.oyd=pb2.yd
: , pb1.okg=pb2.kg
: WHERE pb1.pbin=pb2.pbin && pb1.pbon='';
: Query OK, 1 row affected (0.00 sec)
: Rows matched: 1 Changed: 1 Warnings: 0
: 所以只是我耍白痴,看不懂mysql讯息而己XD
: -------------------------------------------------------------------------
: 我不懂的是:
: 如果
: select pb1.pbin,pb2.pbin,pb1.ipi,pb1.iyd, pb1.ikg, pb2.pi, pb2.yd, pb2.kg
: from pb1 join
: (select pbin, sum(opi) pi , sum(oyd) yd, sum(okg) kg from pb1
: where pbon<>'' &&pb1.pbin='020417008'group by pbin)
: AS pb2 on pb1.pbin=pb2.pbin
: WHERE pb1.pbon='' ;
: +-----------+-----------+------+------+------+------+------+------+
: | pbin | pbin | ipi | iyd | ikg | pi | yd | kg |
: +-----------+-----------+------+------+------+------+------+------+
: | 020417008 | 020417008 | 51.0 | 6810 | 0.00 | 51.0 | 6810 | 0.00 |
: +-----------+-----------+------+------+------+------+------+------+
: 得到我想到的数据,
: 一模一样的句子拿来做update
: update pb1 join
: (select pbin, sum(opi) pi , sum(oyd) yd, sum(okg) kg from pb1
: where pbon<>'' &&pb1.pbin='020417008'group by pbin)
: AS pb2 on pb1.pbin=pb2.pbin
: set pb1.oyd=pb2.yd
: ,pb1.opi=pb2.pi
: ,pb1.okg=pb2.kg
: WHERE pb1.pbon='' ;
: 得到的却是:
: Query OK, 0 rows affected (0.00 sec)
: Rows matched: 1 Changed: 0 Warnings: 0
: matched 和 changed 的不同关键在那里?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.72.102
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1471186334.A.920.html