【发布时间】:2013-08-08 04:06:04
【问题描述】:
使用表格和数据:
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 |
+------+------+
我想按 a 列将 b 列更新为 min(b) 组。
我知道一个正确的 SQL 是:
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 万条记录的表中更新大约需要 5 分钟。
所以,我有一个自己的 SQL:
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,那也会有所帮助。
【问题讨论】:
-
我根据您在stackoverflow.com/a/18081509/2363712 上留下的cmets 对您的问题进行了大量编辑。请检查这些更改并修复可能的拼写错误、误解和其他错误...