我正在处理收集表单数据的复杂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我需要对某些表进行全局更新,特别是我希望使用 FieldName 更新所有 FieldValue 条目到“美国” “country”与 FieldName “city”具有相同的 FormID , FieldValue “Houston”。
通过使用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错误,表明我无法在子查询或内部引用同一个表加入或联盟方案。我甚至创建了一个视图,并尝试在更新语句中引用它,但没有解决方法。 有谁知道如何帮助我?
答案 0 :(得分:21)
您必须使用临时表,因为您无法更新用于选择的内容。一个简单的例子:
这不起作用:
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”将创建表格的临时副本,不会受到更新的影响
答案 1 :(得分:12)
如果我理解正确,别名应该可以解决问题:
UPDATE test AS a
JOIN test AS b ON a.id = b.id
SET a.name = 'New Name'
WHERE a.id = 104;
这不适合你吗?
答案 2 :(得分:1)
Hoyle,ANSI-SQL解决方案将是:
Update test
Set name = "United States of America"
Where FormId In (
Select T1.FormID
From test As T1
Where T1.FieldName = 'city'
And T1.FieldValue = 'Houston'
)
And FieldName = 'country'
我认为您遗失的部分是您需要在子查询中的表上使用别名。