MySQL: arreglando un UNIQUE perdido
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)
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.
- MarcosBL 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 :_)
- mamel 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