traer solo repetir repetidos registros mostrar menos eliminar duplicados dejando consulta agrupar sql mysql

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:

  1. crear una tabla temporal;
  2. INSERT INTO ... SELECT DISTINCT en la tabla temporal de la tabla original;
  3. mesa original clara
  4. INSERT INTO ... SELECT en la tabla original de la tabla temporal
  5. 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);



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