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

Hacer cuatro COUNT con diferentes condiciones en una sola consulta?

Estas en el tema de Hacer cuatro COUNT con diferentes condiciones en una sola consulta? en el foro de Mysql en Foros del Web. tengo las siguientes tablas: 'comentarios' 'shares' 'likes' 'post' 'categorias' necesito saber a traves de una sola consulta: cuantos puntos, likes, comentarios, y shares ha generado ...
  #1 (permalink)  
Antiguo 19/08/2016, 18:53
 
Fecha de Ingreso: diciembre-2015
Mensajes: 115
Antigüedad: 8 años, 4 meses
Puntos: 2
Pregunta Hacer cuatro COUNT con diferentes condiciones en una sola consulta?

tengo las siguientes tablas: 'comentarios' 'shares' 'likes' 'post' 'categorias'

necesito saber a traves de una sola consulta: cuantos puntos, likes, comentarios, y shares ha generado un determinado usuario segun la categoria...

De momento lo intento con:

Código MySQL:
Ver original
  1. SELECT c.nombre AS categoria, SUM(DISTINCT co.positivo) AS puntos, COUNT(DISTINCT co.id_comentario)AS comentarios,COUNT(DISTINCT l.id_like) AS likes, COUNT(DISTINCT s.id_share) AS shares FROM categorias c, comentarios co, likes l INNER JOIN post p LEFT JOIN shares s ON s.id_post=p.id_post WHERE c.id_categoria=p.id_categoria AND co.id_post=p.id_post AND co.id_usuario=$usuario GROUP BY categoria

y me esta resultando a excepcion de los likes que me aparecen siempre los mismos repartidos entre todas las categorias cuando en realidad solo una es la que tiene likes, help
  #2 (permalink)  
Antiguo 22/08/2016, 10:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.

Etiquetas: bases-de-datos, bases-de-datos-general
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 12:43.