Ver Mensaje Individual
  #2 (permalink)  
Antiguo 30/10/2012, 11:26
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.