복붙노트

[SQL] 같은 테이블의 하위 쿼리와 MySQL을 UPDATE

SQL

같은 테이블의 하위 쿼리와 MySQL을 UPDATE

나는를 수집 데이터를 형성하는 복잡한 MySQL 데이터베이스 테이블과 일하고 있습니다. 나는 시험 아래라는 예를 들어 테이블의 레이아웃을 단순화 :

|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에 내가 필요를 통해 특별히 내가 필드 이름 "도시"와 같은 FormID이있는 필드 이름 "국가"와 fieldValue의 "휴스턴"와 "미국"모든 fieldValue의 항목을 업데이트 할 어떤 테이블에 글로벌 업데이트로 만들려면 .

내가 쉽게하거나 하위 쿼리를 사용하거나 내부를 사용하여 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"

그러나 나는 내가 하위 쿼리 또는 내부 조인 또는 노동 조합의 시나리오 중 하나에 동일한 테이블을 참조 할 수 있음을 나타냅니다 MySQL의 오류의 형태를 얻을 내 UPDATE 문을 작성하려고합니다. 난 뷰를 생성하지 않고 업데이트 문이 참조하려고하지만 해결했다. 사람이 어떻게 나를 도와 어떤 생각을 가지고 있습니까?

해결법

  1. ==============================

    1.당신은 당신이 선택하는 데 사용할 뭔가를 업데이트 할 수 없기 때문에, 임시 테이블을 사용해야합니다. 간단한 exemple :

    당신은 당신이 선택하는 데 사용할 뭔가를 업데이트 할 수 없기 때문에, 임시 테이블을 사용해야합니다. 간단한 exemple :

    이것은 작동하지 않습니다 :

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

    "P2 (MYTABLE SELECT * FROM)에서의"업데이트의 영향을받지 않습니다 느릅 나무 테이블의 임시 복사본을 생성합니다

  2. ==============================

    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에 작동했다.

  3. from https://stackoverflow.com/questions/10359534/mysql-update-with-subquery-of-same-table by cc-by-sa and MIT license