복붙노트

[SQL] 단지 MySQL의 쿼리를 사용하여 중복 제거?

SQL

단지 MySQL의 쿼리를 사용하여 중복 제거?

나는 다음과 같은 열이있는 테이블이 있습니다 :

URL_ID    
URL_ADDR    
URL_Time

나는 MySQL의 쿼리를 사용하여 URL_ADDR 열에서 중복을 제거 할.

그것은 어떤 프로그램을 사용하지 않고 그런 일을 할 수 있습니까?

해결법

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

    1.다음 테스트 케이스를 고려 :

    다음 테스트 케이스를 고려 :

    CREATE TABLE mytb (url_id int, url_addr varchar(100));
    
    INSERT INTO mytb VALUES (1, 'www.google.com');
    INSERT INTO mytb VALUES (2, 'www.microsoft.com');
    INSERT INTO mytb VALUES (3, 'www.apple.com');
    INSERT INTO mytb VALUES (4, 'www.google.com');
    INSERT INTO mytb VALUES (5, 'www.cnn.com');
    INSERT INTO mytb VALUES (6, 'www.apple.com');
    

    어디 우리의 테스트 테이블은 이제 포함

    SELECT * FROM mytb;
    +--------+-------------------+
    | url_id | url_addr          |
    +--------+-------------------+
    |      1 | www.google.com    |
    |      2 | www.microsoft.com |
    |      3 | www.apple.com     |
    |      4 | www.google.com    |
    |      5 | www.cnn.com       |
    |      6 | www.apple.com     |
    +--------+-------------------+
    5 rows in set (0.00 sec)
    

    그런 다음 다음과 같이 우리는 여러 테이블 DELETE 구문을 사용할 수 있습니다 :

    DELETE t2
    FROM   mytb t1
    JOIN   mytb t2 ON (t2.url_addr = t1.url_addr AND t2.url_id > t1.url_id);
    

    ... url_id에 따라 첫 번째 URL을 떠나, 중복 된 항목을 삭제한다 :

    SELECT * FROM mytb;
    +--------+-------------------+
    | url_id | url_addr          |
    +--------+-------------------+
    |      1 | www.google.com    |
    |      2 | www.microsoft.com |
    |      3 | www.apple.com     |
    |      5 | www.cnn.com       |
    +--------+-------------------+
    3 rows in set (0.00 sec)
    

    UPDATE - 위의 새로운 의견에 추가 :

    중복 URL이 같은 형식이없는 경우, 당신은 제거 WWW에 REPLACE () 함수를 적용 할 수 있습니다. 또는 http : // 부분. 예를 들면 :

    DELETE t2
    FROM   mytb t1
    JOIN   mytb t2 ON (REPLACE(t2.url_addr, 'www.', '') = 
                       REPLACE(t1.url_addr, 'www.', '') AND 
                       t2.url_id > t1.url_id);
    
  2. ==============================

    2.당신은 http://labs.creativecommons.org/2010/01/12/removing-duplicate-rows-in-mysql/에서 언급 한 방법을 시도 할 수 있습니다.

    당신은 http://labs.creativecommons.org/2010/01/12/removing-duplicate-rows-in-mysql/에서 언급 한 방법을 시도 할 수 있습니다.

    ALTER IGNORE TABLE your_table ADD UNIQUE INDEX `tmp_index` (URL_ADDR);
    
  3. ==============================

    3.이것은 특정 URL_ADDR 가장 높은 URL_ID을 가진 사람을 떠나

    이것은 특정 URL_ADDR 가장 높은 URL_ID을 가진 사람을 떠나

    DELETE FROM table
    WHERE URL_ID NOT IN 
        (SELECT ID FROM 
           (SELECT MAX(URL_ID) AS ID 
            FROM table 
            WHERE URL_ID IS NOT NULL
            GROUP BY URL_ADDR ) X)   /*Sounds like you would need to GROUP BY a 
                                       calculated form - e.g. using REPLACE to 
                                      strip out www see Daniel's answer*/
    

    (파생 테이블 'X'는 "당신은 FROM 절에서 업데이트 대상 테이블 'TABLENAME'를 지정할 수 없습니다"오류를 방지하는 것입니다)

  4. ==============================

    4.글쎄, 당신은 항상 수 :

    글쎄, 당신은 항상 수 :

    그것은 서투른와 어색한, 그리고 여러 쿼리 (권한을 언급하지 않기 위하여)이 필요합니다,하지만 당신은 다른 해결책을 찾을 수없는 경우는 트릭을 할 것입니다.

  5. ==============================

    5.당신은 효과적으로 URL_ADDR 필드에 당신에게 별개의 값을 URL_ADDR에 의해 그룹을 줄 것이다 수있다.

    당신은 효과적으로 URL_ADDR 필드에 당신에게 별개의 값을 URL_ADDR에 의해 그룹을 줄 것이다 수있다.

    select 
     URL_ID
     URL_ADDR
     URL_Time
    from
     some_table
    group by
     URL_ADDR
    

    즐겨!

  6. ==============================

    6.여러 열의 다니엘 Vassallo 방법?

    여러 열의 다니엘 Vassallo 방법?

    DELETE (T2) Directory1에 T1 FROM Directory1에 T2의 ON 가입    (t2.page = t1.page,     t2.parentTopic = t1.parentTopic,     t2.title = t1.title,     t2.description = t1.description,     t2.linktype = t1.linktype,     t2.priority = t1.priority     AND t2.linkID> t1.linkID);

    어쩌면이 같은?

  7. ==============================

    7.이 의지 작업은 URL_ID 열이 고유 한 것이어야한다.

    이 의지 작업은 URL_ID 열이 고유 한 것이어야한다.

    DELETE FROM url WHERE URL_ID IN (
    SELECT URL_ID
    FROM url a INNER JOIN (
        SELECT URL_ADDR, MAX(URL_ID) MaxURLId 
        FROM url
        GROUP BY URL_ADDR
        HAVING COUNT(*) > 1) b ON a.URL_ID <> b.MaxURLId AND a.URL_ADDR = b.URL_ADDR
    )
    
  8. from https://stackoverflow.com/questions/3383898/remove-duplicates-using-only-a-mysql-query by cc-by-sa and MIT license