同じテーブル上の相関クエリでのMySQLの更新

husakg:

次のような問題を簡略化することができます。

元の状態:

id   type   val
---------------
1    1      300
2    1      200
3    1      100
4    2      10
5    2      20
6    2      30

範囲の-状態の所望idの(ここでは3〜4)、更新をval、それが最大値に等しいということにval、所与のためにtype

id   type   val
---------------
1    1      300
2    1      200
3    1      300  <--
4    2      30   <--
5    2      20
6    2      30

だから、唯一の行3と4が更新された、最大valのためのtype1のために、300でtype2それは30です。

私はそれが簡単に更新だと思ったが、私はそれを動作させることはできません。

ここでは、テーブル定義とデータがあります:

create table test (id integer primary key, type integer, val integer);
insert into test (id, type, val) values (1, 1, 300);
insert into test (id, type, val) values (2, 1, 200);
insert into test (id, type, val) values (3, 1, 100);
insert into test (id, type, val) values (4, 2, 10);
insert into test (id, type, val) values (5, 2, 20);
insert into test (id, type, val) values (6, 2, 30);

そして、ここで私が仕事だろうと思ったものです。

update test t1 set t1.val=(
  select max(t2.val) from (
    select * from test where type=t1.type
  ) t2
) where id>=3 and id<5;

しかし、MySQLはエラーを与えます:

不明な列「t1.type」の「where句」

私はそれの用途は、JOINように更新を書き換えることを示唆している同様の問題にいくつかの答えを見つけたが、私はそれを行う方法をわからない - 私の試みは、存在しないテーブルに関するエラーメッセージが表示されました。私が欠けているものを私に教えてください。

tcadidot0:

このクエリをお試しください:

UPDATE test t1 INNER JOIN
(SELECT TYPE,MAX(val) mval FROM test GROUP BY TYPE) t2
ON t1.type=t2.type
SET t1.val=t2.mval
WHERE t1.id BETWEEN 3 AND 4;

ここでフィドル:https://www.db-fiddle.com/f/7Sn9aDBPze7pVvHNHFzQ1u/2

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=15080&siteId=1