Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/08/2016, 10:32
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: Hacer cuatro COUNT con diferentes condiciones en una sola consulta?

Hola kukiko11:

Tienes varios errores (por no decir horrores) en tu consulta... vayamos por partes.

1. Estás mezclando JOIN's implícitos con JOIN's explícitos, es decir, por una lado en el FROM estás listando varias tablas así:

Código:
FROM categorias c, comentarios co, likes l
pero al mismo tiempo utilizas INNER y LEFT JOIN's...

No es recomendable utilizar los JOIN's de la primer forma, es decir, listando las tablas en el FROM y poniendo las condiciones en el WHERE... (esta es la forma implícita). Lo correcto es utilizar siempre JOIN'S EXPLICITOS, es decir hacer algo como esto:

Código:
...
FROM categorias c
INNER JOIN post p ON  c.id_categoria=p.id_categoria
LEFT JOIN comentarios co ON co.id_post=p.id_post
LEFT JOIN shares s ON s.id_post=p.id_post 
...
¿Se entiende?

2. El problema con tu tabla LIKES es que NUNCA ESTÁS RELACIONÁNDOLA CON EL RESTO DE LAS TABLAS... si observas en el WHERE NO ESTÁS COLOCANDO NINGUNA CONDICIÓN DE IGUALACIÓN entre las tablas, de tal suerte que se está realizando un PRODUCTO CARTESIANDO entre las tablas.

3. Estás colocando condiciones JOIN's sin la cláusula ON correspondiente:

Código:
...
INNER JOIN post p 
...
este es el mismo problema que en el punto 2, puede ocasionar que se haga un producto cartesiano entre las tablas.

4. La palabra reservada AS es completamente inútil, no es necesario que la pongas (aunque funcionen las consultas). Sólo se conserva por compatibilidad con versiones anteriores, pero en realidad está fuera del estándar.

5. Trata de darle un ORDEN a tu consulta y no me refiero a poner una condición ORDER BY, sino a darle un formato y limpiar tu consulta. Da lo mismo que tengas un código ofuzcado en una sola línea a tener el query ordenado utilizando 10 renglones...

En este sentido, la consulta debería quedar algo así:

Código MySQL:
Ver original
  1.   c.nombre categoria,
  2.   SUM(DISTINCT co.positivo) puntos,
  3.   COUNT(DISTINCT co.id_comentario) comentarios,
  4.   COUNT(DISTINCT l.id_like) likes,
  5.   COUNT(DISTINCT s.id_share) shares
  6. FROM categorias c
  7. INNER JOIN post p         ON c.id_categoria = p.id_categoria
  8. LEFT  JOIN comentarios co ON co.id_post = p.id_post
  9. LEFT  JOIN likes l        ON * Aquí falta la condición para ligar la tabla de likes *
  10. LEFT  JOIN shares s       ON s.id_post = p.id_post
  11.   co.id_usuario = $usuario
  12. GROUP BY categoria

Observa que al ordenar la consulta es más fácil detectar qué condiciones te faltan y no mezclas en el WHERE las condiciones de los JOIN's con las condiciones para filtrar información.

haz la prueba y nos comentas.

Saludos
Leo.