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

Consulta multi tabla y count()

Estas en el tema de Consulta multi tabla y count() en el foro de Mysql en Foros del Web. Buenos días compañeros, tengo un problema con una consulta multitabla que utiliza la función COUNT(). Os cuento un poco mi estructura de datos: Tengo una ...
  #1 (permalink)  
Antiguo 30/10/2012, 09:29
Avatar de Heent  
Fecha de Ingreso: diciembre-2008
Mensajes: 140
Antigüedad: 15 años, 11 meses
Puntos: 6
Pregunta Consulta multi tabla y count()

Buenos días compañeros, tengo un problema con una consulta multitabla que utiliza la función COUNT().

Os cuento un poco mi estructura de datos:

Tengo una tabla que se llama 'pueblo' con los siguientes campos:
-nombre
-abreviatura

Otra tabla se llama 'amigos' y algunos de sus campos son (los que uso en el código este):
-pueblo
-nombre

Y tengo otra tabla que se llama 'fotos' y sus campos más importantes son:
-pueblo
-id

Los campos llamados "pueblo" de amigos y fotos contienen la abreviatura del pueblo de donde son. Por ejemplo podemos tener esto:

Pueblo : nombre=Barcelona, abreviatura=BCN
Amigos : nombre=Pepito, pueblo=BCN
Fotos: id=009, pueblo=BCN


Entonces yo lo que quiero hacer es recuperar, con una sola consulta en base de datos, a partir de la abreviatura del pueblo el nombre completo del pueblo así como también el total de amigos y de fotos de ese pueblo.

No hay forma que me de el resultado correcto de amigos ni fotos.

Mi consulta es:
Código MySQL:
Ver original
  1. SELECT pueblo.nombre AS pNombre, pueblo.abreviatura AS pAbrev, COUNT(amigos.nombre) AS aTotal,
  2. COUNT(fotos.id) AS fotoTotal FROM pueblo, amigos, fotos WHERE pueblo.abreviatura='BCN'
  3. AND amigos.pueblo='BCN' AND fotos.pueblo='BCN';

Lo he probado con la cláusula GROUP BY amigos.pueblo, fotos.pueblo pero tampoco.


Un saludo y muchas gracias!
  #2 (permalink)  
Antiguo 30/10/2012, 11:26
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Consulta multi tabla y count()

Hola Heent:

En primer lugar, tienes problemas graves en tu consulta que deberías corregir. En realidad no estás especificando ninguna relación entre tus tablas, por lo tanto se estaría realizando un producto cartesiando entre las mismas... No recomiendo unir las tablas con el FROM, prefiero hacer uso del JOIN:

Código:
... 
FROM tabla1, tabla2 
WHERE tabla1.campo = tabla2.campo 
AND tabla1.campo = 'BCN'
....
Observa el elemento marcado con rojo, es justamente lo que te falta, es decir cuál es la relación que existen entre tus tablas... la condición marcada con azul sirve para filtrar la información, pero no define una unión entre tablas y por tanto se hace un producto cartesiano...

Como te dije, no recomiendo hacerlo de esta manera y prefiero el uso de JOIN...

Código:
... 
FROM tabla1 INNER JOIN tabla2 
ON tabla1.campo = tabla2.campo 
WHERE tabla1.campo = 'BCN'
....
Observa que de esta manera NO SE MEZCLAN LOS CRITERIOS DE UNIÓN (que van en la cláusula ON) CON LOS CRITERIOS DE FILTRADO (que van en la parte del WHERE)

Ahora bien, volviendo a tu problema, hay muchas formas distintas para hacer lo que quieres, siguiendo con el tema de los JOIN's podrías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM pueblo;
  2. +-----------+-------------+
  3. | nombre    | abreviatura |
  4. +-----------+-------------+
  5. | Barcelona | BCN         |
  6. | Madrid    | MAD         |
  7. | Otro      | OTR         |
  8. +-----------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM amigos;
  12. +----------+--------+
  13. | nombre   | pueblo |
  14. +----------+--------+
  15. | Pepito   | BCN    |
  16. | Leonardo | OTR    |
  17. | Alguien  | OTR    |
  18. +----------+--------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> SELECT * FROM fotos;
  22. +------+--------+
  23. | id   | pueblo |
  24. +------+--------+
  25. | 009  | BCN    |
  26. | 010  | BCN    |
  27. | 201  | MAD    |
  28. +------+--------+
  29. 3 rows in set (0.00 sec)
  30.  
  31. mysql> SELECT p.abreviatura, p.nombre, a.total_amigos, f.total_fotos
  32.     -> FROM pueblo p
  33.     -> LEFT JOIN ( SELECT a.pueblo, COUNT(a.pueblo) total_amigos
  34.     ->             FROM amigos a
  35.     ->             GROUP BY a.pueblo ) a ON p.abreviatura = a.pueblo
  36.     -> LEFT JOIN ( SELECT f.pueblo, COUNT(f.pueblo) total_fotos
  37.     ->             FROM fotos f
  38.     ->             GROUP BY f.pueblo ) f ON p.abreviatura = f.pueblo;
  39. +-------------+-----------+--------------+-------------+
  40. | abreviatura | nombre    | total_amigos | total_fotos |
  41. +-------------+-----------+--------------+-------------+
  42. | BCN         | Barcelona |            1 |           2 |
  43. | MAD         | Madrid    |         NULL |           1 |
  44. | OTR         | Otro      |            2 |        NULL |
  45. +-------------+-----------+--------------+-------------+
  46. 3 rows in set (0.00 sec)

Observa que los totales se tienen que obtener por separado, ya que la relación entre pueblos-amigos y pueblos-fotos es de 1 a N. para filtrar la información sólo de un pueblo lo único que tendrías que hacer es agregar un WHERE al final de la consulta y agrega el criterio.

Dale un vistazo y si tienes alguna duda coméntala en el foro.

Saludos
Leo.

Etiquetas: count, group, multitabla, select
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:38.