2014-05-16 1 views
0

"customer_id"및 "name"필드가 포함 된이 테이블의 이름이 "TableA"입니다. "ref"라는 새 필드를 추가했습니다. 이제 "ref"필드가 customer_id = 1의 첫 번째 항목에 대해 1001, customer_id = 1의 두 번째 항목에 1002, 그리고 customer_id = 2의 첫 번째 항목에 대해 1001로 설정되도록 테이블을 업데이트하려고합니다. 등등.동일한 테이블에서 집계 하위 쿼리를 사용하는 MySQL 업데이트 쿼리

당연히, 나는 예상했던 mysql 오류 메시지를 가지고있다. "FROM 절의 업데이트를 위해 목표 테이블 'TableA'을 지정할 수 없습니다."

또한 (AS SELECT ... A_sub = customer_id A. A_sub. customer_id)이 WHERE (FROM next_ref 해당) 그런데 MySQL이 " customer_id A."이 발견되지 않는 것을 말한다 사용하려고.

다음 쿼리는 다음과 같습니다

 
UPDATE TableA A 
SET A.ref = (
    SELECT COALESCE(MAX(A_sub.ref) +1, 1001) 
    FROM TableA A_sub 
    WHERE A_sub.`customer_id` = A.`customer_id` 
) 
WHERE o.ref IS NULL; 

질문입니다 : 이것은 하나 개의 쿼리에서 수행 또는 내가 임시 테이블을 사용해야 할 수 있는가? 도움에 감사드립니다!

답변

0

예. 당신은 사용할 필요가 update/join :

UPDATE TableA A join 
     (SELECT A_sub.`customer_id`, COALESCE(MAX(A_sub.ref) +1, 1001) as newref 
     FROM TableA A_sub 
     GROUP BY A_sub.`customer_id` 
     ) A_Sub 
     on A_sub.`customer_id` = A.`customer_id` 
    SET A.ref = newref 
    WHERE a.ref IS NULL; 

편집 :

당신이 자동 증가 ID를 원한다면, 난 당신이 같은 일을 정의하는 것이 좋습니다 것입니다. 1을 넣어야한다면 다음을 할 수 있습니다.

UPDATE TableA A cross join 
     (SELECT @rn := coalesce(MAX(A_sub.ref) + 1, 1001) as maxref 
     FROM TableA A_sub 
     ) vars 
    SET A.ref = (@rn := @rn + 1) 
    WHERE a.ref IS NULL; 
+0

Thx Gordon. 질의는 TableA의 모든 레코드에 대해 "1001"을 설정합니다. 이것은 예상했던 것과 다릅니다 (MySQL 5.1.72에서 테스트). 매 업데이트 후에 조인에서 하위 선택에서 MySQL을 "업데이트"할 수있는 방법이 있습니까? –