MySQL UPDATE与同一个表的SUBQUERY

bjo*_*ock 19 mysql sql phpmyadmin

我正在使用一个收集表单数据的复杂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      |
Run Code Online (Sandbox Code Playgroud)

通过phpmyadmin我需要全球更新一些表格,具体我要更新所有fieldValue方法条目"美利坚合众国"与字段名 "国家"具有相同的FormID字段名 "城市"和fieldValue方法 "休斯敦" .

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

SELECT FieldValue
FROM test
WHERE FormID
IN (
   SELECT FormID
   FROM test
   WHERE FieldName =  "city"
   AND FieldValue =  "Houston"
   )
AND FieldName =  "country"
Run Code Online (Sandbox Code Playgroud)

要么:

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"
Run Code Online (Sandbox Code Playgroud)

但是我尝试编写我的UPDATE语句,我得到某种形式的MySQL错误,表明我无法在子查询内部联接联合场景中引用同一个表.我甚至创建了一个视图,并尝试在更新语句中引用它,但没有解决方法.有谁知道如何帮助我?

Rei*_*.85 28

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

这不起作用:

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

这将完成工作:

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);
Run Code Online (Sandbox Code Playgroud)

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


GDP*_*GDP 12

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

UPDATE test AS a
JOIN test AS b ON a.id = b.id
    SET a.name = 'New Name'
WHERE a.id = 104;
Run Code Online (Sandbox Code Playgroud)

这不适合你吗?