MySQL - Ayuda con consulta pesada

   
Vista:

Ayuda con consulta pesada

Publicado por Hector (1 intervención) el 23/10/2014 22:28:51
Hola!
Tengo un problemón con una consulta bastante pesada que me da la disponibilidad de un hospital para poder pedir cita desde internet.
Por si sola tarda un segundo para una fecha concreta, el problema viene cuando tengo que llamarla 365 veces para sacar la disponibilidad de todo un año día por día. mostrando a los médicos los huecos del año (Es un requisito).

He probado metiéndola en un bucle que va haciendo las consultas como la de abajo e incluso creando una consulta enorme con varios unión entre si pero tarda muchísimo y da la sensación de que se ha quedado colgado el sistema. alguien me podría dar algún truco para mejorar la consulta? es la siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT count(habitaciones.tipoHabitacion) as total
FROM habitaciones
WHERE habitaciones.idhospital= '1' AND habitaciones.tipoHabitacion = '127'
AND habitaciones.online = '1'
AND habitaciones.idHabitacion NOT IN
       (SELECT bloqueoHabitaciones.idHabitacion
         FROM bloqueoHabitaciones WHERE bloqueoHabitaciones.idhospital = '1'
         AND NOT (DATE(bloqueoHabitaciones.fechaInicial) >= DATE('" + fechaFin + "')
              OR  DATE(bloqueoHabitaciones.fechaFinal) <= DATE('" + fechaInicio + "')))
AND habitaciones.idHabitacion NOT IN
        (SELECT reservas.idHabitacion FROM reservas WHERE reservas.idhospital = '1'
         AND reservas.estado !='Eliminada' AND reservas.estado !='No Show' AND reservas.estado !='Reserva cancelada'
         AND not (DATE(reservas.fechaEntrada) >= DATE('" + fechaFin + "')
           OR DATE(reservas.fechaSalida) <= DATE('" + fechaInicio + "')))


Muchisimas gracias por todo de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con consulta pesada

Publicado por Hector (2 intervenciones) el 24/10/2014 02:44:12
He intentando pasarlo a Inner Join pero no consigo que funcione, alguien podri decirme que puede estar fallando?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
    count(H.tipoHabitacion) AS total
FROM
    AviratoPMS.habitaciones H
        INNER JOIN
    AviratoPMS.bloqueoHabitaciones B ON (H.idHabitacion != B.idHabitacion
        AND H.idhospital = 1
        AND H.online = '1'
        AND H.tipoHabitacion = 'CUADRUPLE'
        AND B.idhospital = 1
        AND NOT (DATE(B.fechaInicial) >= DATE('4-10-2014')
        OR DATE(B.fechaFinal) <= DATE('3-10-2013')))
        INNER JOIN
    AviratoPMS.reservas R ON (H.idHabitacion != R.idHabitacion
        AND R.idhospital = 1
        AND R.estado not in ('Eliminada' , 'No Show', 'Reserva cancelada')
        AND NOT (DATE(R.fechaEntrada) >= DATE('4-10-2014')
        OR DATE(R.fechaSalida) <= DATE('3-10-2013')))
;


Gracias de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Leonardo Daniel A.

Ayuda con consulta pesada

Publicado por Leonardo Daniel A. (10 intervenciones) el 24/10/2014 03:34:32
Esta mal chavo...... los joins solo se usan para unir las tablas por sus respectivos campos de union... todo lo demas debe ir en un where

mas o meno asi, cuando no puedas procura usar algun asistente para generar query, yo utilizo navicat para administrar mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
    count(H.tipoHabitacion) AS total
FROM
    AviratoPMS.habitaciones H
        INNER JOIN
    AviratoPMS.bloqueoHabitaciones B ON (H.idHabitacion != B.idHabitacion
        INNER JOIN
    AviratoPMS.reservas R ON (H.idHabitacion != R.idHabitacion
WHERE
        H.idhospital = 1
        AND H.online = '1'
        AND H.tipoHabitacion = 'CUADRUPLE'
        AND B.idhospital = 1
        AND NOT (DATE(B.fechaInicial) >= DATE('4-10-2014')
        OR DATE(B.fechaFinal) <= DATE('3-10-2013')))
        AND R.idhospital = 1
        AND R.estado not in ('Eliminada' , 'No Show', 'Reserva cancelada')
        AND NOT (DATE(R.fechaEntrada) >= DATE('4-10-2014')
        OR DATE(R.fechaSalida) <= DATE('3-10-2013')))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta pesada

Publicado por Hugo qn (30 intervenciones) el 30/10/2014 20:23:16
Hola Hector, has de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT	count(habitaciones.tipoHabitacion) as total
FROM	habitaciones,
		(
		SELECT bloqueoHabitaciones.idHabitacion
			FROM bloqueoHabitaciones
			WHERE bloqueoHabitaciones.idhospital = '1'
			AND NOT (DATE(bloqueoHabitaciones.fechaInicial) >= DATE('" + fechaFin + "') OR DATE(bloqueoHabitaciones.fechaFinal) <= DATE('" + fechaInicio + "'))
		UNION
		SELECT reservas.idHabitacion
			FROM reservas
			WHERE reservas.idhospital = '1'
			AND reservas.estado !='Eliminada'
			AND reservas.estado !='No Show'
			AND reservas.estado !='Reserva cancelada'
			AND NOT (DATE(reservas.fechaEntrada) >= DATE('" + fechaFin + "') OR DATE(reservas.fechaSalida) <= DATE('" + fechaInicio + "'))
		) Dato
WHERE habitaciones.idhospital= '1'
AND habitaciones.tipoHabitacion = '127'
AND habitaciones.online = '1'
AND habitaciones.idHabitacion != dato.idHabitacion

espero te ayude.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta pesada

Publicado por Muchas gracias Hugo (2 intervenciones) el 19/11/2014 12:07:10
Muchas gracias Hugo, lo he probado pero sin embargo parece que me da mal el numero de resultados, supongo que dato no contiene todos los valores posibles, la verdad es que no paro de darle vueltas y no consigo agilizar la dichosa consulta :S

Leonardo, muchas gracias a ti también, pero la tuya no me devuelve ningún registro :S
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta pesada

Publicado por Hugo QN (30 intervenciones) el 20/11/2014 19:45:34
Hector, si gustas te puedo ayudar mediante una conexión remota vía TeamViewer. si es aspi enviarme el ID y clave de TV version 8 a hugo_qn@hotmail.com.
estoy en Lima - Perú para yo conectarme el TV debe estar ejecutando.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar