2012-04-28 100 views
5

我正在使用一個複雜的MySQL數據庫表收集表單數據。我簡單的一個例子表的佈局以下稱爲測試MySQL更新與SUBQUERY同表

|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方法條目「美國美國」與字段名‘國家’具有相同FormID字段名‘城市’和fieldValue方法‘休斯頓’。

我可以很容易地顯示這些條目SELECT語句使用子查詢任一或通過使用INNER JOIN:

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" 

但是我嘗試撰寫我的更新聲明我得到某種形式的MySQL錯誤,指示我無法在子查詢中引用同一個表內部聯接聯合方案。我甚至創建了一個視圖並試圖在更新語句中引用它,但沒有解決。 有沒有人有任何想法如何幫助我?

+0

可能重複的[Mysql錯誤1093 - 無法指定目標表更新在FROM子句](http://stackoverflow.com/questions/45494/mysql-error- 1093-着-指定焦油得到表換更新功能於從子句) – Ian 2014-04-08 15:54:03

回答

6

別名應該做的伎倆,如果我理解正確:

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

這是不是爲你工作?

1

的霍伊爾,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' 

的一塊,我認爲你缺少的是,你需要在子查詢放在桌子上使用的別名。

9

您必須使用臨時表,因爲您無法更新用於選擇的內容。一個簡單的爲例:

這將不工作:

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); 

「從(SELECT * FROM MYTABLE)P2」 將創建一個臨時複製你表,這將不會受到您的更新