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

Juntar INNER JOIN y COUNT

Estas en el tema de Juntar INNER JOIN y COUNT en el foro de Mysql en Foros del Web. Buen día, tengo una consulta a MySql la cual hace un INNER JOIN a varias tablas, pero necesito hacer un ultimo INNER JOIN para que ...
  #1 (permalink)  
Antiguo 26/09/2011, 10:37
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Juntar INNER JOIN y COUNT

Buen día, tengo una consulta a MySql la cual hace un INNER JOIN a varias tablas, pero necesito hacer un ultimo INNER JOIN para que me traiga el numero de registros por grupo, eso se debe hacer con un COUNT pero la verdad no he podido hacerlo.

Les muestro el INNER JOIN:

Código SQL:
Ver original
  1. SELECT grupos.id_grupos, grupos.grp_nombre, grupos.grp_descripcion, grupos.grp_f_ingreso, grupos.grp_tipo_ingreso, acceso.acc_seudonimo, perfil.tp_nombre, subperfil.tsp_nombre
  2. FROM tbl_grupos grupos
  3. INNER JOIN tbl_acceso acceso
  4. ON grupos.id_acceso = acceso.id_acceso
  5. INNER JOIN tbl_tipo_perfil perfil
  6. ON grupos.id_tipo_perfil = perfil.tp_codigo
  7. INNER JOIN tbl_tipo_sub_perfil subperfil
  8. ON grupos.id_tipo_sub_perfil = subperfil.tsp_codigo AND grupos.id_tipo_perfil = subperfil.tp_codigo

El count es este para que me muestre el numero de registros:

Código SQL:
Ver original
  1. SELECT id_grupo, COUNT(*) FROM tbl_grp_miembro WHERE id_grupo = 1

Es posible insertar esa sentencia COUNT dentro del INNER JOIN de arriba ? si se puede por favor me dan una orientación? he intentado de varias formas pero me generan todas error.

EDIT: El campo id_grupo en el contador no es necesario, solo necesito saber el numero de cuantos registros hay en esa tabla con esa condición.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #2 (permalink)  
Antiguo 26/09/2011, 11:22
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Juntar INNER JOIN y COUNT

Hola jotaincubus:

No sé si entendí correctamente qué es lo que quieres hacer, pero veamos si podemos ayudarte. Siempre que utilices una función de agregación (COUNT, MAX, MIN, AVG, etc.) junto con algún otro campo en el SELECT es necesario agregar un GROUP BY, poniendo todos los campos que intervienen en el SELECT...

Prueba con esto:

Código:
SELECT 
grupos.id_grupos, 
grupos.grp_nombre, 
grupos.grp_descripcion, 
grupos.grp_f_ingreso, 
grupos.grp_tipo_ingreso, 
acceso.acc_seudonimo, 
perfil.tp_nombre, 
subperfil.tsp_nombre, 
COUNT(*) total
FROM tbl_grupos grupos
INNER JOIN tbl_acceso acceso
ON grupos.id_acceso = acceso.id_acceso
INNER JOIN tbl_tipo_perfil perfil
ON grupos.id_tipo_perfil = perfil.tp_codigo
INNER JOIN tbl_tipo_sub_perfil subperfil
ON grupos.id_tipo_sub_perfil = subperfil.tsp_codigo AND grupos.id_tipo_perfil = subperfil.tp_codigo
GROUP BY
grupos.id_grupos, 
grupos.grp_nombre, 
grupos.grp_descripcion, 
grupos.grp_f_ingreso, 
grupos.grp_tipo_ingreso, 
acceso.acc_seudonimo, 
perfil.tp_nombre, 
subperfil.tsp_nombre 
Si necesitas agregar alguna condición WHERE a tu consulta la debes colocar antes del GROUP BY. Haz la prueba y nos comentas si te sirvió el código o no.

Saludos
Leo.
  #3 (permalink)  
Antiguo 26/09/2011, 12:27
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: Juntar INNER JOIN y COUNT

Hola, muchas gracias por responderme... Te cuento, resulta que probé tu query, este solo me trae un miembro por grupo.

Vamos a ver si me explico mejor, son varias tablas las del INNER JOIN, en estos traigo el nombre de usuario que lo creo, el tipo de grupo y el subtipo de grupo... Hasta aquí todo va perfecto.

En una tabla mas tengo los usuarios que pertenecen al grupo, el cual relaciono con la tabla grupos por medio del ID_GRUPO. seria mas o menos así:

id_usuario - id_grupo
1 - 5
1 - 4
2 - 5
3 - 5

En ese ejemplo el grupo numero 5 tiene 3 miembros y el grupo numero 4 tiene 1 miembro, lo que trato de lograr es que me muestre cuantos usuarios (registros) hay por grupo haciendo ese INNER JOIN

En el código que amablemente me facilitaste me trae que todos los grupos solo tienen 1 usuario lo cual es falso porque en mi base de datos el grupo 1 tiene 4 usuarios, el 2 tiene 1 usuario y el 3 tiene 1 usuario.

Muchas gracias por tu ayuda.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #4 (permalink)  
Antiguo 26/09/2011, 13:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Juntar INNER JOIN y COUNT

Hola de nuevo jotaincubus:

Aun me queda la duda en el select, si realmente necesitas mostrar tantos campos o solo quieres mostrar el id_grupo y su total. podrías cambiar tu GROUP BY y dejar solamente el campo id_grupo, pero no te serviría si quieres mostrar más información, a ver si con un ejemplo me puedo explicar mejor. Supongamos que tienes los siguientes datos:

Código:
+------------+----------+---------+
| id_usuario | id_grupo | id_otro |
+------------+----------+---------+
|          1 |        5 | ok      |
|          1 |        4 | si      |
|          2 |        5 | no      |
|          3 |        5 | --      |
+------------+----------+---------+
Tu podrías hacer lo siguiente:

Código MySQL:
Ver original
  1. mysql> SELECT id_grupo, COUNT(*) FROM TuTabla GROUP BY id_grupo;
  2. +----------+----------+
  3. | id_grupo | COUNT(*) |
  4. +----------+----------+
  5. |        4 |        1 |
  6. |        5 |        3 |
  7. +----------+----------+
  8. 2 rows in set (0.00 sec)

Hasta aquí no hay problema, pues sólo estás mostrando un campo y agrupas por ese mismo campo, pero si necesitas mostrar también la información del campo id_otro pondrías algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT id_grupo, id_otro, COUNT(*) FROM TuTabla GROUP BY (id_grupo);
  2. +----------+---------+----------+
  3. | id_grupo | id_otro | COUNT(*) |
  4. +----------+---------+----------+
  5. |        4 | si      |        1 |
  6. |        5 | ok      |        3 |
  7. +----------+---------+----------+
  8. 2 rows in set (0.00 sec)

Observa sin embargo que los valores 'NO' y '--' NO APARECEN EN LA CONSULTA, pues al agrupar sólo muestra el primero de ellos.

No sé como necesitas al información, sería conveniente que nos dijeras si realmente necesitas mostrar toda la información o podrías dejarla como en el primer ejemplo.

Saludos
Leo.
  #5 (permalink)  
Antiguo 26/09/2011, 13:37
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: Juntar INNER JOIN y COUNT

Hola, gracias por interesarte en mi tema.

Te cuento que necesito toda la información que esta almacenada en todas las tablas, pero de la ultima solo necesitare el numero de usuarios que estan registrados en ese grupo, para despues con PHP mostrar los resultados asi:

GRUPO 1
Descripcion:
Creado el :
Creado por:
Tipo:
Subtipo:
Numero de miembros:
GRUPO 2
Descripcion:
Creado el :
Creado por:
Tipo:
Subtipo:
Numero de miembros:
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #6 (permalink)  
Antiguo 26/09/2011, 15:17
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Juntar INNER JOIN y COUNT

Hola de nuevo...

En estos momentos no se me ocurre alguna otra cosa más que hagas una subconsulta sobre la misma tabla que tiene tu información. Siguiendo con los datos que puse de ejemplo sería mas o menos así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE TuTabla (id_usuario INT, id_grupo INT, id_otro VARCHAR(2));
  2. Query OK, 0 rows affected (0.12 sec)
  3.  
  4. mysql> INSERT INTO TuTabla VALUES (1, 5, 'ok'), (1, 4, 'si'),
  5.     -> (2, 5, 'no'), (3, 5, '-- ');
  6. Query OK, 4 rows affected, 1 warning (0.03 sec)
  7. Records: 4  Duplicates: 0  Warnings: 1
  8.  
  9. mysql> SELECT * FROM TuTabla;
  10. +------------+----------+---------+
  11. | id_usuario | id_grupo | id_otro |
  12. +------------+----------+---------+
  13. |          1 |        5 | ok      |
  14. |          1 |        4 | si      |
  15. |          2 |        5 | no      |
  16. |          3 |        5 | --      |
  17. +------------+----------+---------+
  18. 4 rows in set (0.00 sec)
  19.  
  20. mysql> SELECT T1.id_usuario, T1.id_grupo, T1.id_otro, T2.total
  21.     -> FROM TuTabla T1
  22.     -> INNER JOIN
  23.     -> (SELECT id_grupo, COUNT(*) total FROM TuTabla GROUP BY id_grupo) T2
  24.     -> ON T1.id_grupo = T2.id_grupo;
  25. +------------+----------+---------+-------+
  26. | id_usuario | id_grupo | id_otro | total |
  27. +------------+----------+---------+-------+
  28. |          1 |        5 | ok      |     3 |
  29. |          1 |        4 | si      |     1 |
  30. |          2 |        5 | no      |     3 |
  31. |          3 |        5 | --      |     3 |
  32. +------------+----------+---------+-------+
  33. 4 rows in set (0.00 sec)

Observa la subconsulta marcada como T2... ahí agrupas por el campo id_grupo para obtener los totales... con el INNER JOIN asignas el total para cada grupo.

Si encuentro alguna otra forma más optima para hacer esto mismo la posteo mañana... por lo pronto dale un vistazo para ver si te sirve.

Saludos
Leo.

Saludos
Leo
  #7 (permalink)  
Antiguo 27/09/2011, 09:34
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: Juntar INNER JOIN y COUNT

Hola amigo, muchas gracias por ayudarme...

Te cuento que probé tal cual me facilitaste, pero con INNER JOIN no me funciono (solo me muestra un registro), utilice el LEFT JOIN y me muestra todos los grupos, pero ocurre algo raro porque a la hora de mostrar los resultados me muestra en la columna total el numero 6 (que es el numero de registros que tengo en miembros) y en los otros me aparece NULL

Sabes que pueda estar pasando ?

te dejo el codigo...

Código SQL:
Ver original
  1. SELECT grupos.id_grupos, grupos.grp_nombre, grupos.grp_descripcion, grupos.grp_f_ingreso, grupos.grp_tipo_ingreso, acceso.acc_seudonimo, perfil.tp_nombre, subperfil.tsp_nombre, miembros.total
  2. FROM tbl_grupos grupos
  3. INNER JOIN tbl_acceso acceso
  4. ON grupos.id_acceso = acceso.id_acceso
  5. INNER JOIN tbl_tipo_perfil perfil
  6. ON grupos.id_tipo_perfil = perfil.tp_codigo
  7. INNER JOIN tbl_tipo_sub_perfil subperfil
  8. ON grupos.id_tipo_sub_perfil = subperfil.tsp_codigo AND grupos.id_tipo_perfil = subperfil.tp_codigo
  9. LEFT JOIN (SELECT id_grupo, COUNT(*) total FROM tbl_grp_miembro) miembros
  10. ON grupos.id_grupos = miembros.id_grupo
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #8 (permalink)  
Antiguo 27/09/2011, 13:11
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Juntar INNER JOIN y COUNT

Hola de nuevo... sin datos reales es muy difícil tratar de ayudarte, como ya te habrás dado cuenta, porque los ejemplos que manejo sólo son con una tabla, mientras que tú estás utilizando muchas más...

Comencemos otra vez desde un inicio, tienes esta consulta
Código MySQL:
Ver original
  1. SELECT grupos.id_grupos, grupos.grp_nombre, grupos.grp_descripcion, grupos.grp_f_ingreso, grupos.grp_tipo_ingreso, acceso.acc_seudonimo, perfil.tp_nombre, subperfil.tsp_nombre, miembros.total
  2. FROM tbl_grupos grupos
  3. INNER JOIN tbl_acceso acceso
  4. ON grupos.id_acceso = acceso.id_acceso
  5. INNER JOIN tbl_tipo_perfil perfil
  6. ON grupos.id_tipo_perfil = perfil.tp_codigo
  7. INNER JOIN tbl_tipo_sub_perfil subperfil
  8. ON grupos.id_tipo_sub_perfil = subperfil.tsp_codigo AND grupos.id_tipo_perfil = subperfil.tp_codigo

Pues bien, publica qué resultado te arroja esta consulta, y qué es lo que quieres obtener como salida.

Saludos
Leo.
  #9 (permalink)  
Antiguo 27/09/2011, 14:06
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: Juntar INNER JOIN y COUNT

O.o la verdad pido disculpas por no haber dado mas datos.

Tengo 5 tablas de las cuales requiero cierta información, estas se llaman:
Acceso, Grupos, Tipo, Subtipo, Grupos_Miembros

La tabla que contiene mayor información es la tabla Grupos de la cual necesito sacar:
ID, Nombre_Grupo, Descripcion_Grupo, Creador, Fecha_Creacion, Tipo_Ingreso

Entre la tabla Acceso y la tabla Grupos necesito hacer un INNER JOIN ya que en la tabla Grupos tengo el ID del usuario que lo creo, pero yo necesito el SEUDONIMO que esta en la tabla ACCESO

Entre la tabla GRUPO y la tabla TIPO necesito hacer un INNER JOIN ya que en la tabla GRUPO tengo el ID del tipo pero necesito el NOMBRE que esta en la tabla TIPO por ejemplo si el tipo es 5 entonces necesito el nombre que es CULTURAL

Entre a tabla GRUPO y la tabla SUBTIPO necesito hacer un INNER JOIN ya que en la tabla GRUPO tengo el ID del subtipo, pero necesito el nombre, por ejemplo el subtipo es 6 pero el nombre es TEATRO

y por ultimo y es lo que me tiene estresado y apunto de arrancarme el cabello es la tabla GRUPO_MIEMBROS, en esta almaceno los miembros que pertenecen a un grupo de modo que guardo el ID del usuario en un campo y en otro tengo el ID del GRUPO. Entonces quiero que en el resultado me salga el numero de usuarios que están en el GRUPO X

Te muestro que es lo que quiero lograr:

ID | NOMBRE | DESCRIPCION | CREADO_POR | CREADO_EL | TIPO | SUBTIPO | MIEMBROS
1 | Grupo1 | Una descrip... | Pepe | 2011-01-01 11:00:00 | cultural | teatro | 8
2 | Grupo2 | Una descrip... | Rolo | 2011-01-01 12:00:00 | deportes | baloncesto | 1
3 | Grupo3 | Una descrip... | Tontin | 2011-01-01 14:00:00 | educación | biologia | 5

Cada | es una columna en el resultado, si quieres saber mas por favor házmelo saber... de nuevo muchas gracias
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???

Etiquetas: contador
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 05:15.