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

concatenar

Estas en el tema de concatenar en el foro de Mysql en Foros del Web. estimados tengo esta tabla alumnos .id .id_grado grados .id .nombre mi idea es luego obtener algo asi Código HTML: titulos cantidades primer grado | segundo ...
  #1 (permalink)  
Antiguo 29/04/2009, 13:49
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
concatenar

estimados tengo esta tabla

alumnos
.id
.id_grado

grados
.id
.nombre

mi idea es luego obtener algo asi

Código HTML:
titulos                            cantidades
primer grado | segundo grado      10 | 20
tengo este codigo pero no me funciona muy bien, a ver que opinan

SELECT CONCAT(G1.nombre,'|',G2.nombre), CONCAT(COUNT(G1.id),'|',COUNT(G2.id)) FROM
alumnos
LEFT OUTER JOIN grados G1 ON G1.id = alumnos.id_grado AND G1.id = 1
LEFT OUTER JOIN grados G2 ON G2.id = alumnos.id_grado AND G2.id = 2
GROUP BY G1.id, G2.id
__________________
On error no hago nada porque deje de fumar...
  #2 (permalink)  
Antiguo 29/04/2009, 14:33
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: concatenar

Que tal dieguicho

Asumo que lo que quieres es contar el numero de estudiantes por cada grupo y mostrarlo en el esquema que muestras.

Pruebalo así:

Código mysql:
Ver original
  1. SELECT CONCAT(G1.nombre,'|',G2.nombre), CONCAT(G1.num1,'|',G2.num2) FROM
  2. alumnos
  3. (select al.id,nombre,count(al.id) num1 from alumnos al left join
  4. grados gr on gr.id=al.id_grado where id_grado=1 group by nombre) G1
  5. ON G1.id = alumnos.id_grado
  6. (select al.id,nombre,count(al.id) num2 from alumnos al left join
  7. grados gr on gr.id=al.id_grado where id_grado=2 group by nombre) G2
  8. ON G2.id = alumnos.id_grado group by G1.nombre;

Nos cuentas como te va.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 29/04/2009, 18:54
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: concatenar

hola huesos!
sabes que todo me da NULL
voy a meter un poco de mano a ver que sucede
__________________
On error no hago nada porque deje de fumar...
  #4 (permalink)  
Antiguo 29/04/2009, 20:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: concatenar

Dieguicho... hice la prueba en dos tablas grados y alumnos.

Grados con id y nombre como atributos, y alumnos con id e id_grado.
Inserté 2 grados (primer grado y segundo grado) e inserté 10 registros en alumnos con grado 1 y 20 con grado 2.

La consulta me funcionó deacuerdo a tu salida y tambien me insertaba un registro de null que posteriormente lo corregí con otro where.

Dinos si tu situación es diferente a lo que hice y te damos una mano.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 30/04/2009, 08:27
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: concatenar

con otro WHERE?
ese WHERE esta en la consulta que me pegaste?
sigue dandome NULL !

la situacion es la misma
__________________
On error no hago nada porque deje de fumar...
  #6 (permalink)  
Antiguo 30/04/2009, 10:20
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: concatenar

Si he entendido bien, quieres algo como lo que puede proporcionarte esta consulta.
Código sql:
Ver original
  1. SELECT CAST( group_concat( t1.nombre
  2. SEPARATOR ' | ' ) AS CHAR ) grado, CAST( group_concat( t1.tot
  3. SEPARATOR ' | ' ) AS CHAR ) cantidades
  4. FROM (
  5.  
  6. SELECT alumnos.id_grado grado, grados.nombre nombre, IFNULL(COUNT( alumnos.id ),'0') tot
  7. FROM alumnos
  8. RIGHT JOIN grados ON grados.id = alumnos.id_grado
  9. GROUP BY id_grado ORDER BY grados.id
  10. )t1

He usado el cast as char, porque las pruebas las estoy haciendo en PHPMyAdmin, pero probablemente no es necesario ese casting y funcionará sin él, al menos en consola.

Última edición por jurena; 30/04/2009 a las 10:28
  #7 (permalink)  
Antiguo 30/04/2009, 10:22
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: concatenar

Tienes razón dieguicho. Omití una validación esencial en la consulta.

prueba con esta:

Código mysql:
Ver original
  1. SELECT CONCAT(G1.nombre,'|',G2.nombre), CONCAT(G1.num1,'|',G2.num2) FROM
  2. alumnos
  3. (SELECT al.id,nombre,count(al.id) num1 FROM grados gr LEFT JOIN
  4. alumnos al on gr.id=al.id_grado WHERE id_grado=1 GROUP BY nombre) G1
  5. ON G1.id = alumnos.id_grado
  6. (SELECT al.id,nombre,count(al.id) num2 FROM alumnos al LEFT JOIN
  7. grados gr on gr.id=al.id_grado WHERE id_grado=2 GROUP BY nombre) G2
  8. ON G2.id = alumnos.id_grado or g1.id = alumnos.id_grado
  9. where G1.nombre is not null GROUP BY G1.nombre;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 30/04/2009, 10:26
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: concatenar

Jurena... me impresionas.
Excelente solución.
Y tienes razón, el cast no es necesario en consola.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 30/04/2009, 10:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: concatenar

gracias, amigo huesos52, pero he tenido que editar para añadir la posibilidad de que de un grado no haya nadie, y recurrir al right join, y controlar, mediante IFNULL, el NULL que sale. Lo convierto en 0. Dieguicho, no creo que tengas problemas con el group_concat (que existe desde la versión 4.1 en adelante), porque el número de grados no será muy amplio (group_concat tiene limitación, 1024 caracteres por defecto). En cuanto al aviso sobre el CAST... AS CHAR, es cierto que no es necesario por consola, pero no he probado a ver qué ocurre si lanzas la consulta desde PHP, y bueno es avisar en estos casos.
Sin el cast, que es lo que corresponde a este foro de MySQL, quedaría así:
Código sql:
Ver original
  1. SELECT group_concat( t1.nombre
  2. SEPARATOR ' | ' ) grado,  group_concat( t1.tot
  3. SEPARATOR ' | ' ) cantidades
  4. FROM (
  5.  
  6. SELECT alumnos.id_grado grado, grados.nombre nombre, IFNULL(COUNT( alumnos.id ),'0') tot
  7. FROM alumnos
  8. RIGHT JOIN grados ON grados.id = alumnos.id_grado
  9. GROUP BY id_grado ORDER BY grados.id
  10. )t1

Y para finalizar añado que datos como estos se sacan perfectamente con esta consulta:
SELECT alumnos.id_grado grado, grados.nombre GRADOS, IFNULL(count( alumnos.id ),'0') cantidades FROM alumnos RIGHT JOIN grados ON grados.id = alumnos.id_grado GROUP BY id_grado ORDER BY grados.id
y luego basta con usar la programación para presentarlos como quieras, me refiero a unirlos en una cadena con ese separador.

Última edición por jurena; 30/04/2009 a las 11:09
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 01:16.