repetir - sql eliminar registros repetidos dejando solo 1
¿Eliminar duplicados utilizando solo una consulta MySQL? (7)
Tengo una tabla con las siguientes columnas:
URL_ID
URL_ADDR
URL_Time
Quiero eliminar duplicados en la columna URL_ADDR
usando una consulta MySQL.
¿Es posible hacer tal cosa sin usar ninguna programación?
Bueno, siempre puedes:
- crear una tabla temporal;
-
INSERT INTO ... SELECT DISTINCT
en la tabla temporal de la tabla original; - mesa original clara
-
INSERT INTO ... SELECT
en la tabla original de la tabla temporal - soltar la tabla de temperatura.
Es torpe y torpe, y requiere varias consultas (sin mencionar los privilegios), pero servirá de mucho si no encuentra otra solución.
Considere el siguiente caso de prueba:
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'');
Donde nuestra tabla de prueba ahora contiene:
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)
Entonces podemos usar la sintaxis DELETE
múltiples tablas de la siguiente manera:
DELETE t2
FROM mytb t1
JOIN mytb t2 ON (t2.url_addr = t1.url_addr AND t2.url_id > t1.url_id);
... que eliminará las entradas duplicadas, dejando solo la primera url basada en 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)
ACTUALIZACIÓN : además de los nuevos comentarios anteriores:
Si las URL duplicadas no tendrán el mismo formato, es posible que desee aplicar la función REPLACE()
para eliminar www.
o http://
partes. Por ejemplo:
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);
Es posible que desee probar el método mencionado en http://labs.creativecommons.org/2010/01/12/removing-duplicate-rows-in-mysql/ .
ALTER IGNORE TABLE your_table ADD UNIQUE INDEX `tmp_index` (URL_ADDR);
Esto funcionará siempre que su columna URL_ID sea única.
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
)
Puede agrupar en el URL_ADDR, que de hecho le dará solo valores distintos en el campo URL_ADDR.
select
URL_ID
URL_ADDR
URL_Time
from
some_table
group by
URL_ADDR
¡Disfrutar!
Daniel Vassallo ¿Cómo hacer para una columna múltiple?
ELIMINAR t2 DEL directorio1 t1 UNIR directorio1 t2 ENCENDIDO (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);
tal como esto?
Esto dejará los que tienen el URL_ID
más alto para un URL_ADDR
particular
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*/
(La tabla derivada ''X'' es para evitar el error "No se puede especificar la tabla de destino ''tablename'' para la actualización en la cláusula FROM")