Necesito obtener las 5 filas cuyo valor en un cierto campo de texto tienen la mayor longitud entre todas. He aquí la consulta SQL necesaria.

Escenario: cierta tabla incluye un campo "fulltext" de tipo longtext y se desea conocer cuáles son las 5 entradas de mayor longitud en dicha columna:

mysql> describe content;
+------------------+---------------------+------+-----+---------------------+----------------+
| Field            | Type                | Null | Key | Default             | Extra          |
+------------------+---------------------+------+-----+---------------------+----------------+
| id               | int(10) unsigned    | NO   | PRI | NULL                | auto_increment |
| title            | varchar(255)        | NO   |     |                     |                |
| introtext        | longtext            | NO   |     | NULL                |                |
| fulltext         | longtext            | NO   |     | NULL                |                |
| state            | tinyint(3)          | NO   | MUL | 0                   |                |
| metadata         | mediumtext          | NO   |     | NULL                |                |
+------------------+---------------------+------+-----+---------------------+----------------+
6 rows in set (0.00 sec)

En MySQL, la función char_length() cuenta la cantidad de caracteres en campos de texto (de tipo CHAR, VARCHAR, TEXT, etc.).

Es posible entonces calcular la longitud del campo "fulltext" para cada fila (char_length(content.fulltext)), ordenar el conjunto por esta longitud de forma descendente (order by length desc), y luego limitar a sólo los 5 primeros resultados (limit 5):

> select id,char_length(content.fulltext) as length from content order by length desc limit 5;

El resultado de la consulta es el siguiente:

mysql> select id,char_length(content.fulltext) as length from content order by length desc limit 5;
+-----+--------+
| id  | length |
+-----+--------+
| 772 | 143961 |
| 236 |  99145 |
| 971 |  95048 |
| 316 |  60970 |
| 389 |  54504 |
+-----+--------+
5 rows in set (0.05 sec)

Cabe destacar que esta función cuenta a los caracteres multi-byte como 1. Es decir, cuenta efectivamente caracteres, no bytes.

Supongamos que ahora se necesita obtener la suma de las longitudes de todos los valores del campo "fulltext". Para ello simplemente recurrir a sum():

mysql> select sum(char_length(content.fulltext)) as length from content;
+---------+
| length  |
+---------+
| 6931439 |
+---------+
1 row in set (0.05 sec)

Por cierto, esa es la cantidad de caracteres de todos los artículos de este blog sin contar éste artículo (casi 7 millones de caracteres).

Referencias


Tal vez pueda interesarte


Compartí este artículo