Enumerando y actualizando posts en MySQL

El otro día me puse a contar posts de Ruleta Rusa y Links de Viernes, resulta que Google en ese afán de querer decirnos cómo debemos bloguear y no respetar un cuerno que a nosotros nos pasemos por el traste sus "reglas" optó por penalizar a cada site cuyos posts tengan el mismo nombre.

He aquí que con más de 400 posts que compartían el nombre tuve que hacer algo para renombrarlos y, al menos, enumerarlos.

No tenía ganas de hacer tablas temporales ni nada por el estilo, así que opté por una forma un tanto cochina que permite MySQL, primero hice una prueba para ver si más o menos podía hacerlo, como si uno estuviese programando en PHP pero esta vez dentro del MySQL, creamos una variable, la seteamos a cero y ésta será nuestro contador, es fácil:

SET @inc :=0;

Nótese el ; (punto y coma) para separar instrucciones, no se lo olviden porque no va a funcionar, el SET es una función separada del SELECT.

De esta manera @inc será una variable que incremente, su valor inicial será cero, ahora hagamos un SELECT de prueba, para ello en el primer campo agrego uno al contador, en el segudo muestro el título, tercero la noticia y cuarto uno que concatene el título, un guión y numeral (porque me place) y luego el número. Como verán usé CONCAT para armar el string final pero también CAST para pasar el número a char porque si no en algunos casos hacía cualquier cosa.

SELECT @inc := @inc +1 AS a, title, id_noticia, CONCAT( title, ' - #' ,CAST(@inc AS CHAR)) AS titulomejorado
FROM `posts`
WHERE title LIKE 'Links de Viernes%' and title <> 'Links de Viernes toda la semana'
ORDER BY time ASC
LIMIT 0 , 300


Busqué todos los LDV y de paso dejé afuera el post donde hablaba del nuevo sitio de los LDV, porque claro, no era lo mismo y me iba a quedar mal numerado.

Una vez que vi que estaba todo ok le agregué una columna temporal a la tabla, a veces hago esta grasada, sirve bastante, algunos hacen toda una tabla paralela y luego la renombran, preferí este cochino método. Obviamente antes de hacer algo así recomiendo hacer backup de la base, uno nunca sabe cuando se olvida de poner el WHERE en el UPDATE :P

Ahora con la idea encaminada me dispuse a actualizar ese nuevo campo, creo un VARCHAR del mismo tamaño que los títulos, con el nombre "titulomejorado" y me dispongo a rellenarlo con lo que corresponda:

SET @inc :=0;
UPDATE posts A
INNER JOIN (
SELECT @inc := @inc +1 AS a, title, id_noticia, CONCAT( title, ' - #' ,CAST(@inc AS CHAR)) AS titulomejorado
FROM `posts`
WHERE title LIKE 'Links de Viernes%' and title <> 'Links de Viernes toda la semana'
ORDER BY time ASC) X
ON X.id_noticia = A.id_noticia
SET A.titulomejorado = X.titulomejorado; 


En este caso hago un join con la búsqueda anterior, la razón es simple, al ya tener todos los ID de noticia ya puedo actualizar uno por uno, funciona bien, es rápido y sólo afecto a las filas de los posts que me interesan, el resto ni se entera.

A muchos les cuesta un poco hacer querys dentro de querys pero donde le tomás la mano sale muy bien, el problema es cuando estás practicando y arruinás todo :D

Una vez ejecutado este UPDATE deja en el campo "titulomejorado" el nuevo título, podemos chequear que todo esté bien y ahí disponernos a usarlo definitivamente:

UPDATE posts
SET title = titulomejorado
WHERE titulomejorado IS NOT NULL; 

Obviamente la condición es importante una vez más, si no ponemos ese where dejando afuera todos los otros posts básicamente les vamos a borrar el título a todas las notas, algo que nos haría entrar en pánico :P

Luego de esto podemos borrar la columna temporal "titulomejorado", ahora todos los posts de Links de Viernes y Ruleta Rusa estan perfectamente numerados, por ahí hay otros posts más viejos que usaron otro título, pero esos no afectan en Google.

Para ver el tema de posts con títulos duplicados usen Webmaster Tools y ahí les dirá donde hay un problemita

Ah ¿se pensaban que ya no posteaba estas cosas en el blog? no se olviden de donde vengo mis muchachos :P, se aceptan correcciones e ideas más performantes a lo que sugiero, esto tan sólo me dio resultado Guiño

Otros posts que podrían llegar a gustarte...

Comentarios

  • tu codigo es mas sucio que una porno de nacho vidal!
    interesante jajajaja

    • Responder
    • Citar
    • Comentado:
  • Ezze    

    Con razón me preguntaba por qué habías enumerado los LDV, ahora ya se la razón. Tengo en cuenta este post sobre MySQL, lo manejo más o menos y esto no lo sabía. Saludos Fabio.

    • Responder
    • Citar
    • Comentado:
  • noah nassir dijo:

    tu codigo es mas sucio que una porno de nacho vidal!
    interesante jajajaja


    jaja sos malo con mi código, pero si, es cochino, sucio, pornográfico, pero... funciona :D ¡como una porno!

    • Responder
    • Citar
    • Comentado:
  • Buenísimo! Se echaba de menos este tipo de post nerds de tu parte Fabio! Ojala los haya más seguido. Hay mucho por aprender.

    Abrazo!

    • Responder
    • Citar
    • Comentado:
  • Lagarto    

    Se extrañaban este tipo de post, sucio pero efectivo. Gracias.-

    • Responder
    • Citar
    • Comentado:
  • Smart    

    No entiendo un pito de sql, solo queria decir que el: (porque me place) no puedo dejar de leerlo con la voz de Favio Alberti haciendo de gallego en Bricolage

    • Responder
    • Citar
    • Comentado:

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https
Para evitar bots, si se tardó mucho en leer la nota seguramente no sirva y tenga que intentar dos veces

Negrita Cursiva Imagen Enlace


comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador