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

Consulta multitabla y count()

Estas en el tema de Consulta multitabla y count() en el foro de Mysql en Foros del Web. Hola que tal, como andan? Hace poco que empeze con esto de las consultas multitablas asique se me complica bastante... Lo que necesito hacer es ...
  #1 (permalink)  
Antiguo 16/05/2012, 17:10
 
Fecha de Ingreso: junio-2010
Mensajes: 18
Antigüedad: 9 años, 5 meses
Puntos: 1
Consulta multitabla y count()

Hola que tal, como andan?

Hace poco que empeze con esto de las consultas multitablas asique se me complica bastante...

Lo que necesito hacer es un conteo en dos tablas diferentes y a la vez traer registros de otra tabla diferente a las anteriores.

Esto se compone mas o menos asi:

Código:
Tabla votos:

id_noticia | id_usuario
1            | 6
2            | 5
2            | 8
2            | 5
Código:
Tabla comentarios:

id_noticia | id_usuario
1            | 6
2            | 5
2            | 8
2            | 5

Código:
Tabla noticias:

id_noticia | contenido
1            | blabla
2            | blabla
3            | blabla
4            | blabla

La idea es traer la cantidad de comentarios y votos, segun id_noticia

esto lo logro con la siguente consulta


Código MySQL:
Ver original
  1. SELECT n.id_noticia, n.contenido, COUNT(v.id_noticia) AS votos_, COUNT(c.id_noticia) AS comentarios_
  2. FROM noticias AS n
  3. LEFT JOIN votos AS v ON n.id_noticia = v.id_noticia
  4. LEFT JOIN comentarios AS c ON n.id_noticia = c.id_noticia
  5. GROUP BY n.id_noticia


Como veran, hago un conteo de los comentarios y votos, y traigo el contenido de cada noticia. Esto funciona perfecto, solo que hay un inconveniente, cuando se ejecuta la consulta, me devuelve los campos votos_ y comentarios_ con el mismo valor (el valor de comentarios_), si quito alguno de los LEFT JOIN funciona bien.. pero necesito hacer todo en una consulta.. espero puedan ayudarme

Gracias de antemano.
  #2 (permalink)  
Antiguo 17/05/2012, 02:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: Consulta multitabla y count()

Código MySQL:
Ver original
  1. SELECT Sbc.id_noticia,
  2.              Sbc.contenido,
  3.              SUM(Sbc.votos_) as NVotos,
  4.              SUM(Sbc.comentarios_) as NComentarios
  5.      SELECT n.id_noticia,
  6.                   n.contenido,
  7.                   COUNT(*) AS votos_,
  8.                   0 AS comentarios_
  9.         FROM noticias AS n
  10.             LEFT JOIN votos AS v
  11.                ON n.id_noticia = v.id_noticia
  12.         GROUP BY n.id_noticia
  13.         SELECT n1.id_noticia,
  14.                      n1.contenido,
  15.                      0 AS votos_,
  16.                      COUNT(*) AS comentarios_
  17.           FROM noticias AS n1
  18.                LEFT JOIN comentarios AS c
  19.                      ON n1.id_noticia = c.id_noticia
  20.            GROUP BY n.id_noticia
  21.    ) as Sbc
  22. GROUP BY Sbc.id_noticia;

Esto servirá....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 17/05/2012, 10:50
 
Fecha de Ingreso: junio-2010
Mensajes: 18
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Consulta multitabla y count()

Muchas gracias! me anduvo a la perfeccion!
  #4 (permalink)  
Antiguo 17/05/2012, 11:00
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 12 años, 9 meses
Puntos: 47
Respuesta: Consulta multitabla y count()

Hola podrias explicar un poco que hace la consulta? xq me rompi la cabeza tratando de hacerla yo para ayudarlo y no me salio jaja
  #5 (permalink)  
Antiguo 18/05/2012, 02:17
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: Consulta multitabla y count()

UNION exige que todas las subquerys tengan elmismo numero de campos y en el mismo orden.

Código MySQL:
Ver original
  1. //Usando Sbc (el resultado de UNION ALL) como origen de datos
  2. //Sumo el numero de votos de la primera subquery con cero de la segunda
  3. //Sumo el numero de comentarios de la segunda subquery con cero de la primera
  4.  
  5.  
  6. SELECT Sbc.id_noticia,
  7.              Sbc.contenido,
  8.              SUM(Sbc.votos_) as NVotos,
  9.              SUM(Sbc.comentarios_) as NComentarios
  10.  
  11. //Subquery donde se cuentan los votos
  12.  
  13. // Corrijo el error de las noticias con cero votos
  14. // Por el LEFT JOIN en el original les asignaba un voto
  15.  
  16. //Creo el campo comentarios a cero
  17.  
  18.      SELECT n.id_noticia,
  19.                   n.contenido,
  20.                   if(v.id_noticia IS NULL,0,COUNT(*)) AS votos_,
  21.                   0 AS comentarios_
  22.         FROM noticias AS n
  23.             LEFT JOIN votos AS v
  24.                ON n.id_noticia = v.id_noticia
  25.         GROUP BY n.id_noticia
  26.  
  27.  
  28.  
  29. //Subquery donde se cuentan los comentarios
  30.  
  31. // Corrijo el error de las noticias con cero comentarios
  32. // Por el LEFT JOIN en el original les asignaba un voto
  33.  
  34. //Creo el campo votos a cero
  35.  
  36.  
  37.         SELECT n1.id_noticia,
  38.                      n1.contenido,
  39.                      0 AS votos_,
  40.                      if(c.id_noticia IS NULL,0,COUNT(*)) AS comentarios_
  41.           FROM noticias AS n1
  42.                LEFT JOIN comentarios AS c
  43.                      ON n1.id_noticia = c.id_noticia
  44.            GROUP BY n.id_noticia
  45.    ) as Sbc
  46.  
  47. GROUP BY Sbc.id_noticia;


Código MySQL:
Ver original
  1. SELECT Sbc.id_noticia,
  2.              Sbc.contenido,
  3.              SUM(Sbc.votos_) as NVotos,
  4.              SUM(Sbc.comentarios_) as NComentarios
  5.      SELECT n.id_noticia,
  6.                   n.contenido,
  7.                   if(v.id_noticia IS NULL,0,COUNT(*)) AS votos_,
  8.                   0 AS comentarios_
  9.         FROM noticias AS n
  10.             LEFT JOIN votos AS v
  11.                ON n.id_noticia = v.id_noticia
  12.         GROUP BY n.id_noticia
  13.         SELECT n1.id_noticia,
  14.                      n1.contenido,
  15.                      0 AS votos_,
  16.                      if(c.id_noticia IS NULL,0,COUNT(*)) AS comentarios_
  17.           FROM noticias AS n1
  18.                LEFT JOIN comentarios AS c
  19.                      ON n1.id_noticia = c.id_noticia
  20.            GROUP BY n.id_noticia
  21.    ) as Sbc
  22. GROUP BY Sbc.id_noticia;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #6 (permalink)  
Antiguo 18/05/2012, 06:41
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 12 años, 9 meses
Puntos: 47
Respuesta: Consulta multitabla y count()

Muchas gracias che siempre se aprenden cosas nuevas y muy utiles.

Saludos

Etiquetas: multitabla, registros, repetidos, sql
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:20.