2017-11-08 5 views
0

중복 행 삭제/업데이트에 대한 몇 가지 다른 게시물을 보았습니다. 그러나 필자의 특정 처지에 올바르게 적용하는 방법에 대해서는 약간 혼란 스러웠습니다.MYSQL에서 논리적 삭제를 위해 중복 행을 업데이트하십시오.

누군가 나를 올바른 방향으로 밀어 줄 수 있기를 바랬습니다.

내가 몇 가지 중복 행이있는 테이블이 논리적으로 1

내 테이블에으로 isDeleted 열을 설정하여 각 사용자에 대해 삭제하려는 부호 BIGINT이다 아이디라는 기본 키가, 중복 된 다른 ID를 나타내는 cid라는 열이 있습니다. cid는 사용자마다 고유하지 않지만 특정 사용자에게는 고유해야합니다.

예를 들어, 당신은 나의 테이블에서 볼 수있다 :

id | cid | userid | is_deleted 
1 | 1 | 100 | 0 
2 | 2 | 101 | 0 
3 | 1 | 102 | 0 
4 | 1 | 100 | 0 
5 | 2 | 101 | 0 

그래서이 경우, 사용자 번호 (100)는 동일한 두 개의 CID를 가지고 - 기록 # 1 및 기록 # 4를. 마찬가지로, 사용자 # 101은 동일한 두 개의 CID를 가지고 있습니다 - 레코드 # 2와 레코드 # 5에

내가 원하는 것은 주어진 사용자에 대해 중복 된 CID를 가져오고 is_deleted를 1로 설정하는 것입니다. 실제 행을 지 웁니다. 하나의 레코드를 is_deleted = 0으로 유지하고 싶습니다. 그래서이 방법은 그대로 유지됩니다.

그래서 내가 바라고 거라고 출력은 다음과 같습니다

id | cid | userid | is_deleted 
1 | 1 | 100 | 0 
2 | 2 | 101 | 0 
3 | 1 | 102 | 0 
4 | 1 | 100 | 1 
5 | 2 | 101 | 1  

내가 코드에서이 작업을 수행 할 수 있지만 오히려 복잡 할 것이다, 나는 순수한 SQL 문에 대한 몇 가지 놀라운 반응을 보았다; 누구든지 조언을하거나 해결책을 제시 할 수 있습니까?

감사합니다.

답변

0

당신은 N 반복 항목에서 1 개 행을 갱신하는 쿼리를 사용할 수 있습니다

Update table t 
inner join 
(select id from table group by userid,cid having count(1)>1) t1 
on t1.id = t.id 
set t.is_deleted=1;