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

Count de varios campos y que me muestre los que sumen 0

Estas en el tema de Count de varios campos y que me muestre los que sumen 0 en el foro de Mysql en Foros del Web. Necesitaria realizar una consulta filtrando por fechas y contanto el numero de apariciones que tiene un usuario en otra tabla pero en varios campos a ...
  #1 (permalink)  
Antiguo 26/01/2011, 15:35
 
Fecha de Ingreso: enero-2011
Mensajes: 2
Antigüedad: 13 años, 2 meses
Puntos: 0
Count de varios campos y que me muestre los que sumen 0

Necesitaria realizar una consulta filtrando por fechas y contanto el numero de apariciones que tiene un usuario en otra tabla pero en varios campos a la vez:


Usuarios:

idUser Nombre Tel
------------------------------------
1______Pedro_____952xxx
2______Juan______952xxx
3______Antonio____952xxx
4______Ana_______952xxx
5______Maria_____952xxx
...


Reservas:

idA idUser1 idUser2 idUser3 Fecha
-----------------------------------------------------
1______1______ 2_____3______10/01/2011
2______3______NULL___1______11/01/2011
3______5______1______2______11/01/2011
4______NULL___NULL___5 ______12/01/2011
5______5______2______NULL____13/01/2011


De tal forma que quiero conseguir una consulta que me genere pero en un rango de fechas


idUser Nombre Tel Apariciones
---------------------------------------
1______Pedro______952xxx______3
2______Juan______952xxx______3
3______Antonio______ 952xxx______2
4______Ana______952xxx______0 <- importante que salga los que no tiene 0 apariciones
5______Maria______952xxx______3
6______Pedro______953xxx______0

Yo he llegado hasta

SELECT iduser, Nombre, Tel, COUNT( Reservas.idUser1 ) + COUNT( Reservas.idUser2 ) + COUNT( Reservas.idUser3 ) AS TotalReservas,
Reservas.Fecha FROM Usuarios INNER JOIN Reservas ON ( Usuarios.idUser = Reservas.idUser1 )
WHERE STR_TO_DATE( Reservas.Fecha, '%d/%m/%Y' ) > ( DATE_SUB( CURDATE( ) , INTERVAL 90 DAY ) ) GROUP BY Usuarios.idUser

pero no me devuelve los que tienen 0 apariciones en la tabla Reservas.
Gracias de antemano.
  #2 (permalink)  
Antiguo 27/01/2011, 04:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Count de varios campos y que me muestre los que sumen 0

Cambia INNER JOIN por LEFT JOIN, si el resto te funcionaba con esto te darà tambien los que no tengan reservas.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 27/01/2011, 14:24
 
Fecha de Ingreso: enero-2011
Mensajes: 2
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Count de varios campos y que me muestre los que sumen 0

Muchas gracias por tu ayuda, he avanzado bastante.


He llegado a este codigo SQL:


SELECT idUser, nombre, Tel
SUM(CASE WHEN (SubConsulta.idUser1 = Usuarios.idUser ) THEN 1 ELSE 0 END )+
SUM(CASE WHEN (SubConsulta.idUser2 = Usuarios.idUser ) THEN 1 ELSE 0 END)+
SUM(CASE WHEN (SubConsulta.idUser3 = Usuarios.idUser ) THEN 1 ELSE 0 END ) AS TotalReservas
FROM Usuarios
LEFT JOIN (SELECT idUser1 ,idUser2,idUser3 FROM Reservas WHERE STR_TO_DATE( Reservas.Fecha, '%d/%m/%Y' ) > ( DATE_SUB( CURDATE( ) , INTERVAL 60
DAY ) ) AND TipoReserva = 'alquiler') AS SubConsulta ON (
Usuarios.idUser= SubConsulta.idUser1 OR
Usuarios.idUser = SubConsulta.idUser2 OR
Usuarios.idUser = SubConsulta.idUser3 )
GROUP BY Usuarios.idUser ORDER BY TotalReservas

El tema es que me lo hace perfecto, el problema es que tarda un monton ya que tengo la Tabla Reservas que tiene unos 200.000 registros y aumenta exponencialmente ya que lo que quiero sacar solo son los de un tramo de 2 meses y por el tema de los OR que tiene que hacer por cada uno de estos 200.000 registros y tengo la tabla usuarios con unos 3.000 usuarios y ya se sabe esto aumenta.

¿Alguna opcion para acelerar el calculo?
Gracias por vuestra ayuda.

Etiquetas: campos, count
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 08:10.