2010-03-20 3 views
0

그래서 MySQL 쿼리 (other question 참고)에 몇 가지 문제가있어 다른 방법을 시도하기로 결정했습니다.MySql에서 duplicate with php (삭제하지 않음)

필자는 나중에 참조 할 때 필요할 수있는 중복 행이있는 데이터베이스 테이블을 가지고 있으므로 제거하고 싶지 않습니다. 내가 찾고있는 것은 복제본없이 데이터를 표시하는 방법이지만이를 제거하지는 않습니다. 나는 (다른 질문에서 설명한 것처럼) 간단한 select 쿼리를 사용할 수 없다.

그래서 내가해야 할 일은 다음을 수행하는 코드를 작성하는 것입니다. 1. 내 db 테이블을 탐색하십시오. 2. "ip"열에 중복 항목을 찾습니다. 3. 각 복제본의 첫 번째 인스턴스에 "0"("중복"이라는 열에 있음)을 표시하고 나머지는 "1"로 표시하십시오.

이렇게하면 중복 된 행만 나중에 선택할 수 있습니다.

참고 : 솔루션이 SELECT 쿼리와 관련이있는 경우 먼저 other question을 읽어보십시오. 이유는 내가 GROUP BY/DISTINCT를 사용하는 것이 아닙니다.

미리 감사드립니다.

+0

이 문제를합니까 기록이 처음이다 :

SELECT t.ip, CASE WHEN @ip != t.ip THEN 0 ELSE 1 END AS duplicate, @ip = t.ip FROM TABLE t JOIN (SELECT @ip = NULL) r ORDER BY t.ip 

당신은 하위 쿼리를 사용하여 해당에서 고유의 IP 행의 목록을 얻을 수 있습니다 ? 그렇다면 복제본 중 첫 번째 복제본은 어떻게 결정합니까? –

+0

사실 상관 없습니다. 제가 하나를 지키고 나머지는 표시하십시오. –

+1

이 정답이 아니십니까? http://stackoverflow.com/questions/2483492/mysql-query-select-distinct-column1-group-by-column2/2484691#2484691 – user187291

답변

1

MySQL은 모든 순위/분석/윈도우 기능이 없지만 대신 변수를 사용할 수 있습니다 다음 duplicate 열에서 제로의 값이

SELECT t.ip, 
     CASE 
      WHEN @ip != t.ip THEN @rank := 0 
      ELSE @rank := @rank + 1 
     END AS duplicate, 
     @ip = t.ip 
    FROM TABLE t 
    JOIN (SELECT @rank := 0, @ip = NULL) r 
ORDER BY t.ip 

ip 값의 첫 번째 발생이됩니다 ; 모든 후속 레코드의 값은 1 씩 증가합니다. 당신은 증가 수를 원하지 않는 경우, 사용

SELECT x.ip 
    FROM (paste either query in here) x 
WHERE x.duplicate = 0