MySQL: arreglando un UNIQUE perdido - Userlinux.net

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.…

MySQL: arreglando un UNIQUE perdido

31.Jul.2008 ~ 2 Comentarios ~ 982 Lecturas
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.
Categorías: programación

Comentarios


gravatar
31.Jul.2008
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
01.Aug.2008
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

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • Juan
  • Marina
  • Francisco
  • fon
  • minWi
  • isra
  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ssh frases champions userlinux iphone lugo rsidenotes felicidades films nintendo opinion sysadmin 2008 blogsfera vacaciones juegos cake ds debian sidenotes apple web blogs mac mysql cakephp deportes 2007 mundial openbsd barça ubuntu twitter blog humor meme canción alemania_2006 games bsd lucux linux twitt programación cumpleaños software django league bash macosx ps3 rfilms conciertos freebsd seguridad personal hack php bake futbol

Archivo

Social

Enlaces de interés