设置演示
CREATE TABLE mytable
(id INT UNSIGNED NOT NULL PRIMARY KEY
, thestring VARCHAR(32)
, price DECIMAL(11,2)
) ENGINE=INNODB
;
INSERT INTO mytable (id, thestring, price) VALUES
(1,'0011' , 123.45)
,(2,'00110' , 45.67)
,(3,'001100' , 0.00)
,(4,'10' , 4.44)
,(5,'100' , 5.55)
,(6,'1000' , 0.00)
;
编写标识MYTABLE
SELECT y.*
FROM `mytable` `y`
WHERE y.price = 0.0
ORDER BY y.id
在Y行的查询添加一个连接到MYTABLE找到匹配的X行
SELECT x.id AS x_id
, x.thestring AS x_thestring
, x.price AS x_price
, y.id AS y_id
, y.thestring AS y_thestring
, y.price AS y_price
FROM mytable `y`
JOIN mytable `x`
ON CONCAT(x.thestring,'0') = y.thestring
WHERE y.price = 0.0
ORDER BY y.id
将SELECT转换为UPDATE。 (替换SELECT ... FROM与UPDATE和WHERE子句前添加一个SET子句。
UPDATE mytable `y`
JOIN mytable `x`
ON CONCAT(x.thestring,'0') = y.thestring
SET x.price = 0.5
WHERE y.price = 0.0
只是f(x.thestring)
更换CONCAT(x.thestring,'0')
。
另一种选择是使用相关子查询。
首先,写一个SELECT
SELECT x.*
FROM mytable `x`
WHERE EXISTS (SELECT 1
FROM mytable `y`
WHERE y.thestring = f(x.thestring)
AND y.price = 0.00
)
的然后将其转换为UPDATE。将SELECT ... FROM
替换为UPDATE
关键字,并在WHERE
子句前添加SET
子句。
UPDATE mytable `x`
SET x.price = 0.5
WHERE EXISTS (SELECT 1
FROM mytable `y`
WHERE y.thestring = f(x.thestring)
AND y.price = 0.00
)
我猜触发器会在这里工作 – minigeek
哇......不是那么容易吗? –
这应该只是一个'WHERE'子句,可能是一个自连接。我并不确定我是否了解这种情况,您能否显示一些样本数据和预期结果? – Barmar