2017-03-09 12 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

Whoa ... not super easy? –

+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) 
; 

一致するXの行を見つけるためにmytableをする参加追加mytableは

SELECT y.* 
    FROM `mytable` `y` 
WHERE y.price = 0.0 
ORDER BY y.id 

でY行を特定するクエリを書く

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と... FROM SELECT交換して、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 
      ) 

アンを書きますdをUPDATEに変換します。 SELECT ... FROMUPDATEキーワードに置き換え、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

ああ、いいですね。 –

関連する問題