MySQL更新,条件是WHERE的结果(已解决)。

问题描述 投票:0回答:1

如何从结果中根据多个条件进行更新?WHERE? "比如说?

UPDATE tb_a, tb_b, tb_c
SET tb_a.A = 
CASE 
  WHEN COUNT(tb_b.is_field_null IS NULL) = 0 
  THEN "OK" 
  ELSE "Nope" 
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
AND tb_a.b = tb_b.a
AND tb_c.b = tb_b.c

给出的表格是

tb_a

a          |    b        |      A
------------------------------------------
"some"     | "thing"     | "XXX"
"some"     | "thing"     | "YYY"

tb_b

a             | c           | is_field_null 
----------------------------------------------
"thing"       | "else"      | "I have things here" 
"thing"       | "else"      | NULL
"otherThing   | "otherElse" | NULL

tb_c

b            | c           | mapper 
----------------------------------------------
"else"       | "else"      | "ZZZ" 
"else"       | "else"      | "KKK"

我试过了,没有 COUNT 条件,导致整个列 tb_a.A 修改为 "不"。这就像

tb_a

a          |    b        |      A
------------------------------------------
"some"     | "thing"     | "Nope"
"some"     | "thing"     | "Nope"

但随着 COUNT,有一个错误的 Invalid use of group function.我试过了 if譬如

SET tb_a.A = (if COUNT(tb_b.is_field_null IS NULL) = 0, "Yes", "Nope"),

条件,但仍然错误。

我希望完全不需要修改,谁能帮帮我?

由 @forpas 提供的答案

我发现有一个问题。如果将 tb_b 修改为

a             | c           | is_field_null 
----------------------------------------------
"thing"       | "else"      | "I have things here" 
"thing"       | "else"      | "I have things here" 
"otherThing   | "otherElse" | NULL

那么查询后的tb_a仍然是

a          |    b        |      A
------------------------------------------
"some"     | "thing"     | "Nope"
"some"     | "thing"     | "Nope"

是线 CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter FROM tb_b) tWHEN NOT EXISTS(SELECT 1 FROM tb_b WHERE is_field_null IS NULL) 的返回结果不做检查。WHEREON 子句?它从原始 tb_b 本身执行检查?

第三次查询从 forpas 是工作。

在这种情况下,有一些我不太明白的地方。从 forpas的前两个查询,如果我把它们从 UPDATESELECT,他们选择前2行的 tb_b 正确。但在 UPDATE 模式,既不

CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter FROM tb_b) t

WHEN NOT EXISTS(SELECT 1 FROM tb_b WHERE is_field_null IS NULL)

的条件下执行。WHEREON. 谁能帮我澄清一下?

更新

据我有限的了解,目前这里的问题的紧凑形式是

UPDATE tb_a.A
CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter 
   FROM tb_a
    INNER JOIN tb_b ON tb_a.b = tb_b.a
    INNER JOIN tb_c ON tb_c.b = tb_b.c
    WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
) t
SET tb_a.A = CASE
  WHEN t.counter = 0 THEN "Yes"
  ELSE "Nope"
END
WHERE tb_a.a = "some"

请参考 @forpas 的回答,了解完整的表格解决方案,以及在以下网站上的精彩替代方案。NOT EXISTS.

mysql conditional-statements where-clause
1个回答
2
投票

使用适当的连接,同时 CROSS JOIN 的查询结果。COUNT(tb_b.is_field_null IS NULL) 像这样。

UPDATE tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter FROM tb_b) t
SET tb_a.A = CASE 
  WHEN t.counter = 0 THEN "OK" 
  ELSE "Nope" 
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"

或与 NOT EXISTS:

UPDATE tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
SET tb_a.A = CASE 
  WHEN NOT EXISTS(SELECT 1 FROM tb_b WHERE is_field_null IS NULL) THEN "OK" 
  ELSE "Nope" 
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"

编辑:

UPDATE tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
CROSS JOIN (
  SELECT SUM(is_field_null IS NULL) counter 
  FROM tb_a
  INNER JOIN tb_b ON tb_a.b = tb_b.a
  INNER JOIN tb_c ON tb_c.b = tb_b.c
  WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
) t 
SET tb_a.A = CASE 
  WHEN t.counter = 0 THEN "OK" 
  ELSE "Nope" 
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
© www.soinside.com 2019 - 2024. All rights reserved.