[SQL] 단지 MySQL의 쿼리를 사용하여 중복 제거?
SQL단지 MySQL의 쿼리를 사용하여 중복 제거?
나는 다음과 같은 열이있는 테이블이 있습니다 :
URL_ID
URL_ADDR
URL_Time
나는 MySQL의 쿼리를 사용하여 URL_ADDR 열에서 중복을 제거 할.
그것은 어떤 프로그램을 사용하지 않고 그런 일을 할 수 있습니까?
해결법
-
==============================
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.당신은 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.이것은 특정 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.글쎄, 당신은 항상 수 :
글쎄, 당신은 항상 수 :
그것은 서투른와 어색한, 그리고 여러 쿼리 (권한을 언급하지 않기 위하여)이 필요합니다,하지만 당신은 다른 해결책을 찾을 수없는 경우는 트릭을 할 것입니다.
-
==============================
5.당신은 효과적으로 URL_ADDR 필드에 당신에게 별개의 값을 URL_ADDR에 의해 그룹을 줄 것이다 수있다.
당신은 효과적으로 URL_ADDR 필드에 당신에게 별개의 값을 URL_ADDR에 의해 그룹을 줄 것이다 수있다.
select URL_ID URL_ADDR URL_Time from some_table group by URL_ADDR
즐겨!
-
==============================
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.이 의지 작업은 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 )
from https://stackoverflow.com/questions/3383898/remove-duplicates-using-only-a-mysql-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SELECT 절에서 여러 설정을 돌려주는 기능을위한 예상되는 동작은 무엇인가? (0) | 2020.04.16 |
---|---|
[SQL] 어떻게 SQL에서 INSERT에 대한 중복 값을 피하기 위해? (0) | 2020.04.16 |
[SQL] 테이블 사용 ROWNUM의 두 번째 행을 선택 (0) | 2020.04.16 |
[SQL] 포스트 그레스 대소 문자 구분 (0) | 2020.04.16 |
[SQL] MySQL의 테이블에서 중복을 삭제하는 방법 (0) | 2020.04.16 |