sql >> Databasteknik >  >> RDS >> Mysql

Ta bort dubbletter med endast en MySQL-fråga?

Tänk på följande testfall:

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');

Där vår testtabell nu innehåller:

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)

Sedan kan vi använda multipla-tabellen DELETE syntax enligt följande:

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

... vilket kommer att radera dubbletter av poster, vilket bara lämnar den första webbadressen baserad på url_id :

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)

UPPDATERA - Vidare till nya kommentarer ovan:

Om dubblettadresserna inte kommer att ha samma format, kanske du vill använda REPLACE() funktion för att ta bort www. eller http:// delar. Till exempel:

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);


  1. Åtgärda "FEL: saknar FROM-klausulpost för tabell" i PostgreSQL när du använder UNION, EXCEPT eller INTERSECT

  2. Bästa sättet att göra kapslad case-satslogik i SQL Server

  3. Skapa MySQL-frågeövervakningsbash-skript

  4. få tillgång till ett kolumnalias i where-satsen i postgresql