Concatenar dentro de la propia consulta en MySQL

Guardar este artículo en Delicious Compartir este artículo en Twitter Compartir este artículo en Facebook

Me estoy empezando a acostumbrar a buscar soluciones a mis necesidades desde la propia consulta a la BD. Antes me limitaba a realizar consultas INSERT, UPDATE, SELECT o DELETE de lo más normales, y una vez recibidos los datos los trataba mediante PHP. Incluso en mis inicios, para hacer una media o buscar el máximo consultaba todos los datos y sacaba la solución programando en vez de usar algo tan simple como AVG o MAX en la consulta. Imagino que tampoco es tan raro cuando empiezas y cuando nadie te ha explicado que se puede hacer de otra manera.

Pero concatenar era algo que creo que nunca había necesitado -aunque sabía que podía hacerlo-, y esta semana en cambio he tenido que probar a ver que tal. Además, al final incluso he acabado usando una función que desconocía, GROUP_CONCAT, en vez de la más conocida CONCAT.

Imaginemos que queremos un string con la dirección completa de un lugar y que tenemos esa información guardada en una tabla, pero tenemos guardados por separado la dirección, el código postal, la ciudad y la provincia. Puedes hacer una SELECT, pedirle todos los datos y concatenarlos al gusto mediante PHP. Pero también podemos recibir los datos ya formateados de la propia consulta utilizando CONCAT, por ejemplo:

SELECT CONCAT( `direccion`, ' - ', `ciudad`, '/', `codigopostal`, ' (', `provincia`, ')' ) as `address` FROM `places` WHERE `id` = '123'
Nos devolvería algo así: "C/ La Paz, 43 - Barakaldo/48903 (Bizkaia)"

También puede que queramos juntar varios campos en un string, separados todos por el mismo caracter o caracteres. Para eso, lo mejor sería usar CONCAT_WS, dónde el primer parametro que le pasamos es el separador que concatenará el resto de parametros de la función. Vamos a poner otro ejemplo:

SELECT CONCAT_WS( ', ', `telefono_personal`, `telefono_trabajo`, `movil`, `fax` ) as `telephone_list` FROM `listing` WHERE `id` = '123'
Nos devolvería algo así: "945678345, 91234567, 612312389, 911234234"

El último caso para el que voy a poner otro ejemplo es para el uso de GROUP_CONCAT. Imagina que tenemos un tabla de posts, y una tabla de tags relacionada con los posts. Es decir cada uno de los posts puede tener uno, ninguno o varios tags. Y nuestro objetivo en este caso, es sacar de una sola consulta un listado con los títulos de los posts y todos los tags asociados a este. Se podría hacer con una serie de consultas y PHP, pero también lo podemos hacer de una sola (lo hacemos así porque una INNER JOIN no sacaría los posts que no tuvieran tags asociados y una LEFT JOIN nos saquería una fila por cada tag y lo que queremos es una fila por cada post):

SELECT posts.title, (SELECT GROUP_CONCAT(tags.name) FROM tags WHERE posts.id = tags.post_id) AS `alltags` FROM posts
Nos devolvería algo así:
"Tïtulo del primer post", "tag1, tag2, tag3, tag4"
"Post sin tags", NULL
"Este sería otro post", "tag3, tag4, tag1"

No sé si os servirá de mucha ayuda, pero al menos, recordaros a todos que MySQL tiene funciones para strings y que muchas veces pueden ayudarnos y ahorrarnos un poco de código.

7 Comentarios
  1. Matachin

    Muy interesante, creo que tengo alguna pagina por ahí que puedo optimizar con el concatenado.

    Gracias!

  2. jeison999

    hooo la funcion concat no la concia!! se ve util seguro que la acabare utilizando en projecto del insti que tengo ahora !

  3. servidorverde

    La verdad que puede ahorrar mucho tiempo,…… gracias a este tipo de aportaciones muchas veces vemos la luz, sin tener que aburrirnos dentro de los manuales

  4. Exer

    Genial tus consultas de especial la ultima me parece adecudada para muchas busquedas y resultados sin tantos pasos Arigatou

  5. edua

    Muchas gracias amigo, me sirvio de muchoen el proyecto y concuero plenamente con Exer. Saludos

  6. mil8000

    Gracias, me sirvio de mucho sobre todo GROUP_CONCAT.

Deja un comentario

Trackbacks