MySQL: arreglando un UNIQUE perdido

31.jul 2008 Envía un trackback

Un pequeño error de diseño se puede pagar con algo así:
SELECT slug, id
FROM posts
WHERE id NOT IN
(
        SELECT p.id FROM (
                SELECT DISTINCT slug, id
                FROM posts
                GROUP BY slug
        ) AS p
);
 
El bug surge por no haber puesto un campo único como tal. Supongamos que el campo slug1) de cada noticia no es único e introducimos dos slugs iguales: tenemos un problema.

Una vez nos hemos dado cuenta y queremos corregir el error, lo primero es saber el número de filas afectadas para aplicar el parche, tarea que en un principio parecía sencilla hasta que piensas en cómo hacerlo sin usar PHP -no tendría la misma gracia-. Diversión asegurada:
  • Primero seleccionamos todos los slugs distintos y nos quedamos con su id: SELET .pid FROM (SELECT DISTINCT slug, id FROM posts GROUP BY slug) as p
  • Usamos esa subconsulta para seleccionar los que NO aparecen en ella: SELECT slug, id FROM posts WHERE id NOT IN (consulta1)
Y ya tendríamos nuestro listado de registros a corregir, ahora si, con PHP.


1) Slug: Dícese -en entornos de desarrollo- del campo que guarda en base de datos la url accesible de un título de noticia, por ejemplo el slug de una noticia "Bienvenidos a mi Blog" podría ser "bienvenidos-a-mi-blog.html". Con lo que es más que interesante que la información no esté duplicada.
unique blog database

Comentarios
Gravatar MarcosBL@31.07.2008, 'Re: MySQL: arreglando un UNIQUE perdido'

No es el mismo planteamiento, pero creo que os serviria para un caso similar. En una sola consulta en lugar de tres anidadas, siempre que sea a título "informativo":

SELECT slug, COUNT(slug)
FROM posts
GROUP BY slug
HAVING ( COUNT(slug) > 1 )

MySQL is beautiful :_)

Gravatar mamel@01.08.2008, 'Re: MySQL: arreglando un UNIQUE perdido'

no, el objetivo era que la consulta retornara el valor del todos los ids duplicados salvo el que se metio primero, que seria el original a conservar


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]