2017-12-01 8 views
0

두 개의 열 1,2가 포함 된 tableA라는 테이블이 있습니다. 배열의 내용에 따라 값 1을 제거하려고합니다. 그 값이 두 번 존재하면 col1을 col1 = col1 - 2으로 설정하고 싶습니다.UPDATE WHERE IN() mysql

WHERE IN()이 배열의 중복 값을 무시하지 않으면 나는 UPDATE tableA SET col1 = col1 - 1 WHERE col2 IN (?); .. [arr]을 사용할 수 있습니다.

이 키는 기본 키 또는 고유 키가 아니며 중복 값에는 문제가 없음을 유의하십시오. 다음은 X를 수정해야하는 쿼리입니다.

UPDATE tableA SET col1 = col1 - X WHERE col2 IN (?); .. [arr] 

나는 내가 편곡에 대한 루프를 할 수 알고 같은 간단한 쿼리를 실행합니다 UPDATE tableA SET col1 = col1 - 1 WHERE col2 = ? ; .. [arr[i]] 때마다하지만 더 나은 방법을 찾기 위해 노력하고 -가있는 경우.

답변

1

당신은 UPDATE ... JOIN 사용할 수 있습니다

UPDATE tableA a 
JOIN (SELECT id, COUNT(*) cnt 
     FROM (SELECT 1 AS id UNION ALL SELECT 1 UNION ALL SELECT 1 
      UNION ALL SELECT 2 UNION ALL SELECT 2) x -- here goes IN values 
     GROUP BY id 
    )s 
    ON a.col2 = s.id 
SET a.col1 = a.col1 - cnt; 

DBFiddle Demo

+0

내가이 줄을 이해하는 문제의 비트'아이디 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION 그대로 하나를 선택 ALL SELECT 2)', 조금 설명해 주시겠습니까? –

+0

@JohnJames 포인트가'IN (1,2,3)'=>'대신에 (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 3') 최종 쿼리에서 당신은'IN'을 전혀 사용하지 않습니다 – lad2025

+0

오, 알았어, 고마워. 불행히도 'FROM IN (?)', ... [arr] 여기서 arr = [1,1,2]; –