2017-03-09 35 views
0

假设f是一个字符串函数,如0连接:f(0011)= 00110。SQL更新:这样的行...?

假设mytable具有列string这是一个索引和price

我愿做类似下面的伪代码:

UPDATE mytable SET price(X)=0.5 FOR ALL THOSE ROWS X SUCH THAT 
THE ROW Y SUCH THAT THE `string` OF Y equals f(the `string` FOR X) 
HAS price(Y)=0 

更一般地,我怎么可以参考

“行,使得[条件成立,也就是说,取决于在当前行]“

in(My)SQL?

+0

我猜触发器会在这里工作 – minigeek

+0

哇......不是那么容易吗? –

+0

这应该只是一个'WHERE'子句,可能是一个自连接。我并不确定我是否了解这种情况,您能否显示一些样本数据和预期结果? – Barmar

回答

1

设置演示

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 
      ) 
1

使用带自联接的UPDATE

UPDATE mytable AS x 
JOIN mytable AS y ON y.string = f(x.string) 
SET x.price = 0.5 
WHERE y.price = 0 
+0

哦,那很好。 –