26

フォーム データを収集する複雑な 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 "city" およびFieldValue "Houston"と同じFormIDを持つFieldName "country" を持つ"United States of America"に更新したいと考えています。 .

これらのエントリは、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 エラーが発生します。ビューを作成し、更新ステートメントでこれを参照しようとしましたが、解決しませんでした。誰かが私を助ける方法を知っていますか?

4

2 に答える 2

36

選択に使用するものを更新できないため、一時テーブルを使用する必要があります。簡単な例:

これは機能しません:

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」はテーブルの一時的な複製を作成しますが、更新の影響を受けません

于 2015-11-09T10:45:27.387 に答える
16

私が正しく理解していれば、エイリアシングでうまくいくはずです。

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

これはあなたのために働いていませんか? 更新:これはテストされ、MySQLv5.6で動作します。

于 2012-04-28T01:55:30.000 に答える