-2

次のテーブル構造があります。

ステータス: TINYINT

locked_by: 整数

日付: DATETIME

ページ: TINYINT

my_id: BIGINTEGER

PRIMARY KEY IS (ページ、my_id)

次のインデックスがあります。

INDEX idx_col_lock_status (locked_by、ステータス)、

INDEX idx_my_id (my_id)

ある時点で、次の行があります。

status, locked_by, date, page, my_id

2       243        NULL  0     1
0       0          NULL  1     1
1       244        NULL  2     1
2       255        NULL  0     2
2       2556       NULL  1     2
2       255        NULL  2     2

status値が! = 2 または

彼らはステータス値を持っています = 2 *しかし* あります

ステータスが != 2の同じmy_id を持つ別の行

上記の更新後、上記の行は次のようになります。

status, locked_by, date, page, my_id

0       0          NULL  0     1   --note this line
0       0          NULL  1     1
0       0          NULL  2     1   --and this line
2       255        NULL  0     2
2       2556       NULL  1     2
2       255        NULL  2     2

Mysql バージョン 5.1.63 を使用しています。

ありがとう

4

1 に答える 1

0

それはそれを行う必要があります:

CREATE TEMPORARY TABLE tt(my_id int);
INSERT INTO tt SELECT my_id FROM yourTable WHERE status != 2);

UPDATE yourTable yt
SET yt.status = 0, yt.locked_by = 0
WHERE status != 2
OR 
(status = 2 AND EXISTS (SELECT 1 FROM tt WHERE yt.my_id = tt.my_id));

DROP TABLE tt;

更新とサブクエリに同じテーブルを使用できないため、ここでは一時テーブルを使用する必要があります。

于 2012-11-19T15:07:28.643 に答える