Ver Mensaje Individual
  #9 (permalink)  
Antiguo 13/03/2014, 15:19
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: Count (*) Left Join

Hola unexes:

Tal como lo adelantó gnzsoloyo, tienes un problema grave de diseño que unido con el uso del LEFT JOIN está ocasionando más dolores de cabeza que los "normales" para cualquier DBA... El que tengas dobles referencias hacia una misma tabla (con las Actividades 1 y 2), es un error de diseño y de normalizacion, sobre todo porque veo que uno de los campos puede quedar como null...

Una de las primeras reglas de la normalización de BD's es que NO DEBES TENER LLAVES FORÁNEAS EN CAMPOS QUE ACEPTEN NULOS... en lugar de tener estos dos campos, debes hacer una tabla referencia y colocar un atributo que te indique si es la actividad 1 o la actividad 2, es decir, algo como esto:

Código:
Id-------Activación--------Actividades----------------Url---- tipoActividad
1------------1----------------Neumaticos------------http: etc..---1
1------------1----------------Carroceria-------http: etc..---2
2------------1----------------Neumaticos------------http: etc..---|
2------------1----------------Chapa-------------http: etc..---2
3------------1----------------Carroceria--------------http: etc..---1
3------------1----------------Neumaticos-----http: etc..---2
4------------1----------------Peluquerias-----http: etc..---1
¿Se entiende la idea?

Esto es solo una idea, en realidad son muchos aspectos adicionales que debes tomar en cuenta. Si tienes oportunidad de modificar tu modelo de datos, hazlo... te evitarás más problemas en el futuro... (El que tengas pereza no cuenta como una razón de peso para no modificar tu diseño de tablas).

ahora bien, volviendo a tu problema original, tal como te diste cuenta, el conteo de registros cuando utilizas LEFT JOIN puede no ser tan simple... por lo que veo lo único que te interesa es saber cuántas actividades de cada categoría hay en tu tabla clientes, podrías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT actividad, COUNT(actividad) FROM
  2.     -> ( SELECT actividades actividad FROM clientes
  3.     ->   UNION ALL
  4.     ->   SELECT actividades2 actividad FROM clientes ) T
  5.     -> WHERE actividad IS NOT NULL
  6.     -> GROUP BY actividad
  7.     -> ORDER BY 2 DESC;
  8. +-------------+------------------+
  9. | actividad   | COUNT(actividad) |
  10. +-------------+------------------+
  11. | Neumaticos  |                3 |
  12. | Carroceria  |                2 |
  13. | Peluquerias |                1 |
  14. | Chapa       |                1 |
  15. +-------------+------------------+
  16. 4 rows in set (0.00 sec)

es decir, con el UNION ALL "corriges" el error de diseño que tienes en tus tablas, al convertir una doble referencia en una referencia simple...

Dale un vistazo para ver si te sirve el código.

Saludos
Leo