mysql如何更新自己的表工作

前端之家收集整理的这篇文章主要介绍了mysql如何更新自己的表工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在MysqL中有一个表:

  1. CREATE TABLE test.tem(a INT,b INT);

以下数据:

  1. INSERT INTO test.tem VALUES(1,2),(1,1),NULL),(2,3);

现在数据应该是:

  1. +------+------+
  2. | a | b |
  3. +------+------+
  4. | 1 | 2 |
  5. | 1 | 1 |
  6. | 1 | NULL |
  7. | 2 | 3 |
  8. +------+------+

我想按列a将列b更新到min(b)组.

所以sql应该是:

  1. UPDATE test.tem o
  2. SET o.b = (SELECT
  3. MIN(b)
  4. FROM test.tem i
  5. WHERE i.a = o.a)

但是MysqL无法在FROM子句中指定更新目标表

所以我认为下面的sql可以很好地解决我的问题:

  1. UPDATE test.tem t1
  2. JOIN test.tem t2
  3. ON t1.a = t2.a
  4. SET t1.b = t2.b
  5. WHERE t1.b IS NULL
  6. OR t1.b > t2.b;

但结果是:

  1. +------+------+
  2. | a | b |
  3. +------+------+
  4. | 1 | 1 |
  5. | 1 | 1 |
  6. | 1 | 2 |
  7. | 2 | 3 |
  8. +------+------+

其实我需要的结果是:

  1. +------+------+
  2. | a | b |
  3. +------+------+
  4. | 1 | 1 |
  5. | 1 | 1 |
  6. | 1 | 1 |
  7. | 2 | 3 |
  8. +------+------+

问题1:为什么MysqL使用sql计算出错误的结果?具有高效率的正确sql应该是什么?
问题2:如果我只想用NULL值更新b(仅更新第三条记录),sql应该是什么?

关于问题2,我试图使用下面不正确的sql

  1. UPDATE test.tem t1
  2. JOIN test.tem t2
  3. ON t1.a = t2.a
  4. AND t1.b IS NULL
  5. SET t1.b = t2.b
  6. WHERE t1.b IS NULL
  7. OR t1.b > t2.b;
最佳答案
您没有唯一列来标识行.因此,yourJOIN可能会按您的意愿更新更多行.

你可能想要这样的东西:

  1. UPDATE tem AS t1 JOIN (SELECT a,MIN(b) AS m FROM tem GROUP BY a) AS t2
  2. USING (a)
  3. SET t1.b = t2.m;

http://sqlfiddle.com/#!2/c6a04/1

如果您只想更新列b中具有NULL的行,这只是WHERE子句的问题:

  1. CREATE TABLE tem(a INT,b INT);
  2. INSERT INTO tem VALUES(1,3);
  3. UPDATE tem AS t1 JOIN (SELECT a,MIN(b) AS m FROM tem GROUP BY a) AS t2
  4. USING (a)
  5. SET t1.b = t2.m
  6. WHERE t1.b IS NULL;

http://sqlfiddle.com/#!2/31ffb/1

猜你在找的MySQL相关文章