テーブルとデータを使用します。
CREATE TABLE test.tem(a INT,b INT,INDEX (a),INDEX (b));
INSERT INTO test.tem VALUES(1,2),(1,1),(1,NULL),(2,3);
データは次のようになります。
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 1 |
| 1 | NULL |
| 2 | 3 |
+------+------+
列 b を列 a ごとに min(b) グループに更新したいと考えています。
私が知っている正しい SQL の 1 つは次のとおりです。
UPDATE tem AS t1
JOIN (SELECT a,MIN(b) AS m FROM tem GROUP BY a) AS t2
USING (a)
SET t1.b = t2.m;
正しい結果を生成するには、次のようにします。
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 2 | 3 |
+------+------+
ただし、この SQL クエリを使用して 450 万レコードの 1 つのテーブルを更新するには、約 5 分かかります。
だから、私は自分自身のSQLを1つ持っています:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
SET t1.b = t2.b
WHERE t1.b > t2.b
OR t1.b IS NULL;
しかし、それは間違った結果を得ます:
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
+------+------+
その理由は、更新時の MYSQL の動作にあると思います。間違った結果がどのように出てくるか誰か教えてもらえますか? 誰かが私のSQL を修正できれば、それも役に立ちます。