【问题标题】:MySQL UPDATE with SUBQUERY of same tableMySQL UPDATE 与同一张表的 SUBQUERY
【发布时间】:2012-05-08 17:27:11
【问题描述】:

我正在处理一个收集表单数据的复杂 MySQL 数据库表。我在下面名为 test 的示例表中简化了布局:

|FormID|FieldName|  FieldValue |
|   1  |   city  |   Houston   |
|   1  | country |     USA     |
|   2  |   city  |   New York  |
|   2  | country |United States|
|   3  | property|   Bellagio  |
|   3  |  price  |     120     |
|   4  |   city  |   New York  |
|   4  |zip code |    12345    |
|   5  |   city  |   Houston   |
|   5  | country |     US      |

通过 phpMyAdmin 我需要对某些表进行全局更新,特别是我想更新所有 FieldValue 条目使用 FieldName 到“美国” “国家”与 FieldName“城市”和 FieldValue“休斯顿”具有相同的 FormID

我可以通过使用 SUBQUERY 或使用 INNER JOIN 的 SELECT 语句轻松地显示这些条目:

SELECT FieldValue
FROM test
WHERE FormID
IN (
   SELECT FormID
   FROM test
   WHERE FieldName =  "city"
   AND FieldValue =  "Houston"
   )
AND FieldName =  "country"

或者:

SELECT a.FieldValue
FROM test a
INNER JOIN test b ON a.FormID = b.FormID
WHERE a.FieldName = "country"
AND b.FieldName = "city"
AND b.FieldValue = "Houston"

但是我尝试编写我的 UPDATE 语句,但我得到某种形式的 MySQL 错误,表明我无法在 子查询inner 中引用同一个表加入联合方案。我什至创建了一个 view 并尝试在更新语句中引用它,但没有解决。 有谁知道如何帮助我?

【问题讨论】:

标签: mysql sql phpmyadmin


【解决方案1】:

您必须使用临时表,因为您无法更新用于选择的内容。一个简单的例子:

这不起作用:

UPDATE mytable p1 SET p1.type= 'OFFER' WHERE p1.parent IN 
    (SELECT p2.id from mytable p2 WHERE p2.actu_id IS NOT NULL);

这样就可以了:

UPDATE mytable p1 SET p1.type= 'OFFER' WHERE p1.parent IN 
    (SELECT p2.id from (SELECT * FROM mytable) p2 WHERE p2.actu_id IS NOT NULL);

"from (SELECT * FROM mytable) p2" 将创建您的表的临时副本,它不会受到您的更新的影响

【讨论】:

  • MYSQL 5.7.9 (Wampserver 3 64 bit) 没有买这个技巧,它仍然抱怨使用同一个表进行更新和选择,我什至添加了另一个内部“select *”但仍然没有不行。
  • @jose : 你能发布你的请求吗?
【解决方案2】:

如果我理解正确的话,别名应该可以解决问题:

UPDATE test AS a
JOIN test AS b ON a.id = b.id
    SET a.name = 'New Name'
WHERE a.id = 104;

这不适合你吗? 更新:已在 MySQL v5.6 上测试并运行。

【讨论】:

  • 我检查的版本是 5.5.50,也许有些问题已经修复了。
猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2013-03-05
相关资源
最近更新 更多