Y cuanto dió la ejecución de la Query?? Te faltó el final de la historia! :P
Cuantas palabras tienen tus posts
Hoy estaba pensando en esto ¿como cuernos cuento las palabras en mis posts? es que nunca me puse a hacerlo y de pronto me di cuenta que en MySQL no hay funciones para esto ¡hay que googlear! ya mismo, pásenme la googlera.
Así fue que encontré una forma, pero resulta que no sólo tengo que contar palabras si no que tengo que, primero, sacarle todo el HTML que yo le agrego a mis posts.
Así es, en el viejo y querido PostRev el código se agrega a mano lo que complica identificar una palabra y los números no me daban, así que a crear dos funciones, wordcount y strip_tags.
La cuestión también está en que una base de datos no es precisamente para hacer cuentas, esas debería hacerlas aparte, pero salvo que sean sumatorias estas eran cosas para hacer aparte. ¿como hacerlo y seguir dentro de MySQL? creando funciones y utlizándolas en la consulta.
Es un poco intensivo y recomiendo hacerlo solamente con una copia local de la base de datos, así si tienen que esperar no bloquean el blog durante un rato.
A continuación se las comento
Contar Palabras
Primero que nada, a contar palabras. Estamos ingresando un texto y tiene que devolvernos un entero con la cantidad de palabras:
DELIMITER $$ CREATE FUNCTION wordcount(str TEXT) RETURNS INT DETERMINISTIC SQL SECURITY INVOKER NO SQL BEGIN DECLARE wordCnt, idx, maxIdx INT DEFAULT 0; DECLARE currChar, prevChar BOOL DEFAULT 0; SET maxIdx=char_length(str); WHILE idx < maxIdx DO SET currChar=SUBSTRING(str, idx, 1) RLIKE '[[:alnum:]]'; IF NOT prevChar AND currChar THEN SET wordCnt=wordCnt+1; END IF; SET prevChar=currChar; SET idx=idx+1; END WHILE; RETURN wordCnt; END $$ DELIMITER ;
Borrar tags HTML
Lo segundo y no menos importante, hay que sacarle toda la basura, bah, esto se hace antes de contar las plabras pero lo armé después porque no me daban los números ¡Estaba todo lleno de HTML! y si, lo cuenta como más palabras... borremoslo más o menos así:
DELIMITER $$ CREATE FUNCTION strip_tags( x longtext) RETURNS longtext LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE sstart INT UNSIGNED; DECLARE ends INT UNSIGNED; SET sstart = LOCATE('<', x, 1); REPEAT SET ends = LOCATE('>', x, sstart); SET x = CONCAT(SUBSTRING( x, 1 ,sstart -1) ,SUBSTRING(x, ends +1 )) ; SET sstart = LOCATE('<', x, 1); UNTIL sstart < 1 END REPEAT; return x; END $$ DELIMITER ;
La consulta
En el caso del postrev tengo dos campos a consultar, hometext y bodytext, uno para el texto de portada, el otro el resto de la nota (es mi diseño, no es tan malo como parece
![:P](themes/Fabio11/images/smilies/icon_tongue.gif)
Básicamente tomo el campo, lo paso por strip_tags y luego por wordcount, esto lo filtro por año y estado para tomar datos reales.
SELECT id_noticia, (wordcount(strip_tags(hometext)) + wordcount(strip_tags(bodytext))) AS palabras FROM posts WHERE estado = 1 AND year(time) = 2011 ORDER BY 2 DESC
Para Wordpress es básicamente igual cambiando algunos campos:
SELECT ID, (wordcount(strip_tags(post_content))) AS palabras FROM wp_posts WHERE post_status = 'publish' AND year(post_date) = 2011 ORDER BY 2 DESC
y listo!
Armado con funciones de aquí y aquí
Otros posts que podrían llegar a gustarte...
Comentarios
-
Acá tienen el top ten del 2011 en tamaño:
http://www.fabio.com.ar/4595 Diario de Viaje: París 3963
http://www.fabio.com.ar/4758 Y llegó el turno de Cuevana 3615
http://www.fabio.com.ar/4270 Diario de Viaje: Roma 3479
http://www.fabio.com.ar/4323 La conquista de Marte 3402
http://www.fabio.com.ar/4418 Diario de Viaje: Praga 3398
http://www.fabio.com.ar/4733 Las cadenas de e-mails no son la realidad 3079
http://www.fabio.com.ar/4396 Ley Pinedo, como NO legislar para internet 2889
http://www.fabio.com.ar/4745 Actualidad de los blogs en Argentina 2590
http://www.fabio.com.ar/4724 Lugares extremos del planeta 2501
http://www.fabio.com.ar/4480 El límite de las App Stores 2500
http://www.fabio.com.ar/4420 A 50 años de la hazaña de Yuri Gagarin 2369
-
Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D
-
Este es el tipo de cosas que convendría calcular solamente a la hora de editar o agregar un post (seguramente conviene hacerlo desde php, con str_word_count) y después guardar el valor en la misma tabla.
Recalcularlo a la hora de ordenar los posts por cantidad de palabras seguro tarda demasiado :P
-
blklaucha dijo:
Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D
Y cuando queres hacer un ranking de los posts con mas palabras de tu blog? Ratapashhh.. ahi tenes uno de los motores de la era informatica XD
-
Para wordpress hay un plugin, es un archivo php unico cortito de un par de lineas.. vale la pena mirarlo
http://wordpress.org/extend/plugins/post-word-count/installation/
-
blklaucha dijo:
Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D
4600 posts, 50 posts por mes este año ¿word?
Gonzalo dijo:
Este es el tipo de cosas que convendría calcular solamente a la hora de editar o agregar un post (seguramente conviene hacerlo desde php, con str_word_count) y después guardar el valor en la misma tabla.
Recalcularlo a la hora de ordenar los posts por cantidad de palabras seguro tarda demasiado :P
totalmente, por eso recomiendo hacerlo con una base offline para evitar problemas en el server
-
Fabio dijo:
blklaucha dijo:
Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D
4600 posts, 50 posts por mes este año ¿word?
Eso es tu culpa por escribir tanto y nuestra por leerte tanto:p