MySQL: arreglando un UNIQUE perdido

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. [@MORE@] 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.
sysadmin

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.
  • 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 postsGROUP BY slugHAVING ( COUNT(slug) > 1 ) MySQL is beautiful :_)
  • 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
blog comments powered by Disqus