Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

concatenar resultados de una consulta

Estas en el tema de concatenar resultados de una consulta en el foro de Mysql en Foros del Web. Tengo la siguiente consulta : select eje_nombre from ejemplares Donde el resultado que me devuelve la consulta es el siguiente MARCA AS EL PAIS EL ...
  #1 (permalink)  
Antiguo 20/04/2008, 15:02
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
concatenar resultados de una consulta

Tengo la siguiente consulta :

select eje_nombre from ejemplares

Donde el resultado que me devuelve la consulta es el siguiente
MARCA
AS
EL PAIS
EL MUNDO
ABC
EL PERIODICO

En total son 6 registros, y necesito que la consulta me devuelva un solo registro, pero con este formato:

MARCA-AS-EL PAIS-EL MUNDO-ABC-EL PERIODICO
  #2 (permalink)  
Antiguo 21/04/2008, 00:50
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: concatenar resultados de una consulta

Esto lo resuelves mucho mejor con programación y no dentro de la base de datos. Con un implode que incluya como separador el guión lo resuelves por ej. con PHP. Creo que será lo mejor. Pide ayuda en el foro PHP, si es ese el programa que manejas.
En la base de datos debes tener un campo que te sirva para agrupar, es decir un campo cuyo dato compartan los registros, en tu caso tal vez tengas un campo que indique que se trata de prensa, de periódicos y cuyo dato sea común a los 6. Pues bien, si tienes eso, también puedes hacerlo con esto en MySQL:
SELECT group_concat(eje_nombres SEPARATOR '-' ) FROM `ejemplares` GROUP BY campocomun HAVING campocomun = 'datocampocomun'
  #3 (permalink)  
Antiguo 21/04/2008, 01:11
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

Tal como tu comentas lo suyo sería en programación, en mi caso con AJAX, pero no me lo recupera bien cuando la consulta me devuelve más de uno, por eso quería intentar hacerlo con la base datos, cuando dices de hacer esta query :

SELECT group_concat(eje_nombres SEPARATOR '-' ) FROM `ejemplares` GROUP BY campocomun HAVING campocomun = 'datocampocomun'

Yo le paso una condición para hacer un where, hay un campo que se llama tipo_ejemplar, que para el caso que sea diarios este campo contiene "D", entonces para el ejemplo que me comentas sería esto :

SELECT group_concat(eje_nombres SEPARATOR '-' ) FROM `ejemplares` GROUP BY tipo_ejemplar HAVING tipo_ejemplar = 'D'

La verdad que me interesa que la consulta me devuelva un solo registro :
MARCA-AS-EL PAIS-EL MUNDO-ABC-EL PERIODICO

Saludos
Jaime
  #4 (permalink)  
Antiguo 21/04/2008, 01:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: concatenar resultados de una consulta

Prueba y verás que funciona, pero, como te digo, yo usaría la programación. Yo no trabajo con Ajax, pero pregunta en el foro, pues en realidad cuando cargas los datos, cargas un array y hacer un implode imagino que no será difícil.
De todas formas, lo que dices te funcionará. Incluso puedes ordenar por algún otro campo la salida, y eso se hace dentro del group_concat, pues puedes poner un ORDER BY... dentro del paréntesis.
Ah, ponle un alias para cargar los datos:
SELECT group_concat(eje_nombres SEPARATOR '-' ) AS lista_diarios FROM `ejemplares` GROUP BY tipo_ejemplar HAVING tipo_ejemplar = 'D'
  #5 (permalink)  
Antiguo 21/04/2008, 01:21
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

La forma de hacerlo en programación la tengo hecha pero cuando en medio está el AJAX me da problemas, y esto lo he planteado en el foro de AJAX y no me han respondido después de 1 semana.

Por lo tanto la opcion de base de datos la voy a probar, lo haré esta noche y te comento cualquier cosa.
  #6 (permalink)  
Antiguo 21/04/2008, 08:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: concatenar resultados de una consulta

Puedes generar una función en MySQl que te haga el loop en la tabla y genere el string.
Solamente no debes olvidarte de poner antes de BEGIN la cláusula READS SQL DATA
  #7 (permalink)  
Antiguo 21/04/2008, 11:16
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

Y como se haría esa función, soy nuevo en el MySQL
  #8 (permalink)  
Antiguo 21/04/2008, 14:50
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

Buenas,

Lo estoy probando en mi sp, que es la siguiente:

DELIMITER $$

DROP PROCEDURE IF EXISTS `periodicos`.`SP_EJEMPLARES_L`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_EJEMPLARES_L`(vCodigo INT)
BEGIN
DECLARE vTipo VARCHAR(10);

set vTipo = (select tipo_eje_codigo from lista_de_precios where mat_cod_interno = vCodigo);

select
group_concat(eje.eje_nombre SEPARATOR '-' ) as nombre
from
ejemplares eje
inner join lista_de_precios lp on lp.tipo_eje_codigo = eje.tipo_eje_codigo
GROUP BY
eje.tipo_eje_codigo
HAVING eje.tipo_eje_codigo = vTipo;
END$$

/*
SHOW VARIABLES LIKE 'coll%';
*/

DELIMITER ;

Y el resultado me devuelve repetido. Se puede realizar un distinct, como sería?

AS-MUNDO DEPORTIVO-AS-SPORT-MARCA-SPORT-VIDA DEPORTIVA-MARCA-MUNDO DEPORTIVO-VIDA DEPORTIVA
  #9 (permalink)  
Antiguo 22/04/2008, 00:29
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

ESTO SERÍA CORRECTO?

DECLARE vTipo VARCHAR(10);

set vTipo = (select tipo_eje_codigo from lista_de_precios where mat_cod_interno = vCodigo);

SELECT
GROUP_CONCAT(DISTINCT eje.eje_nombre ORDER BY eje.nombres DESC SEPARATOR '-' ) AS nombre
FROM
ejemplares eje
INNER JOIN lista_de_precios lp ON lp.tipo_eje_codigo = eje.tipo_eje_codigo
GROUP BY
eje.tipo_eje_codigo
HAVING
eje.tipo_eje_codigo = vTipo;
  #10 (permalink)  
Antiguo 22/04/2008, 00:50
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: concatenar resultados de una consulta

infolan,

creo que estás mezclando dos soluciones.
La solución que te propuse yo la tienes con:

select group_concat(distinct eje.eje_nombre SEPARATOR '-' ) as nombre
from ejemplares eje inner join lista_de_precios lp on lp.tipo_eje_codigo = eje.tipo_eje_codigo GROUP BY eje.tipo_eje_codigo
HAVING eje.tipo_eje_codigo = 'D'

Lánzala sin más, sin hacer procedure ni function y verás el resultado.

Con esto te bastará en principio si no vas a hacer muchas veces cadenas de ese tipo separadas con guiones.

Lo que te propuso gnzsoloyo es más práctico y tiene el objetivo de que si tienes intención de encadenar otras salidas puedas hacerlo invocando una función que aplicada a cualquier consulta de ese tipo retorne una cadena con los resultados separados con guiones. Al parecer él te hablaba de un loop, imagino que con while..., por lo que probablemente no pensaba en el group_concat, aunque de eso no estoy tan seguro. Yo no he trabajado con funciones de MySQL, por lo que no puedo decirte cómo hacerlo... De todas maneras, seguro que puedes hacer una función también con esa sintaxis y group_concat.

Última edición por jurena; 22/04/2008 a las 01:01
  #11 (permalink)  
Antiguo 22/04/2008, 01:36
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

es tal como tu me comentas, solamente lo tengo que utilizar para un caso.

Por cierto en esta base de datos tengo acentos en catalan, como este "català", que cuando lanzo la consulta me devuelve esto "catal?".

Ayer noche encontré una sentencia que te dice el collation de tres valores (ahora no me acuerdo, lo tengo en casa)

Un collation me decía algo UTF8.
Un collation de base de datos, me decía latin1_suizo(inglés)_ci
Un collation de conexión, me decía latin1_suizo(inglés)_ci

Se puede cambiar estos dos últimos a latin1_spanish_ci?
  #12 (permalink)  
Antiguo 22/04/2008, 01:37
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

Por cierto con lo de distinct, ya no se me repetirá, no?
  #13 (permalink)  
Antiguo 22/04/2008, 01:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: concatenar resultados de una consulta

Sí se puede aplicar la collation o cotejamiento que desees, pero si el charset para tu base UTF8 debes usar una collation o cotejamiento utf8_spanish_ci, que debes aplicar a la tabla y también a los campos donde tengas nombres con acento. Si manejas PhPMyAdmin para este tipo de cosas te resultará fácil hacerlas. No debes usar para la base un charset utf8, y para las tablas y campos un cotejamiento que no sea utf8. Si tu base no la quieres tener con charset utf8, sino latin1 deberás usar cotejamientos de tabla y campo de latin1_spanisch_ci. Pero lo primero que debes decidir es el charset para la base.

En cuanto al DISTINCT, sí creo que funcionará y ya no se repetirán los datos en la salida de ese GROUP_CONCAT.

Última edición por jurena; 23/04/2008 a las 11:52 Razón: editado para recomendar la colación específica
  #14 (permalink)  
Antiguo 22/04/2008, 01:58
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

Pruebo lo que me comentas esta noche a ver que tal y te comento.

Gracias
  #15 (permalink)  
Antiguo 22/04/2008, 23:30
 
Fecha de Ingreso: noviembre-2005
Mensajes: 405
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: concatenar resultados de una consulta

Al final ha funcionado lo del distinct.

Por cierto como se puede capturar un error de una stored procedure en una ASP, es decir, lanzo una consulta y dicha consulta da un error, me gustaría poder capturarlo en pantalla de la ASP.

En SQL Server me suena algo de un print, creo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:37.