Ver Mensaje Individual
  #5 (permalink)  
Antiguo 18/05/2012, 01:17
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
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.