MySQL - ¿Como arreglar esta consulta?

   
Vista:

¿Como arreglar esta consulta?

Publicado por Yazo (1 intervención) el 11/08/2008 22:47:46
Hola chic@s,

Necesito ayuda con una consulta que estoy realizando pero me falla y no se porque es, la consulta es la siguiente:

SELECT flotas.id as idflota, flotas.nombre as nombreflota, flotas.logotipo as logoflota, coches.id as idcoche, coches.nombre as nombrecoche, coches.fotocoche as fotocoche, coches.videocoche as videocoche, rutas.nombre as nombreruta, rutas.id as idruta, rutas.ano as anoruta, rutas.opciones as opcionesruta, tarifas.mes as mestarifa,

(SELECT MIN(LEAST(if(tar.preciopromocion>0, tar.preciopromocion, 100000), if(tar.tarifa1>0, tar.tarifa1, 100000), if(tar.tarifa2>0, tar.tarifa2, 100000), if(tar.tarifa3>0, tar.tarifa3, 100000), if(tar.tarifa4>0, tar.tarifa4, 100000), if(tar.tarifa5>0, tar.tarifa5, 100000), if(tar.tarifa6>0, tar.tarifa6, 100000), if(tar.tarifa7>0, tar.tarifa7, 100000))) AS tarifamenor FROM tarifas AS tar WHERE tar.idruta='idruta' AND tar.mes='mestarifa') AS tarifamenos

FROM (((flotas INNER JOIN coches ON flotas.id=coches.idflota) INNER JOIN rutas ON coches.id=rutas.idcoche) INNER JOIN tarifas ON rutas.id=tarifas.idruta)

WHERE rutas.oculto='0'
AND flotas.oculto='0'
AND rutas.destino = '1'
AND TIMESTAMP(CONCAT(rutas.ano, '-', tarifas.mes, '-', tarifas.dia)) >= TIMESTAMP(DATE_FORMAT(NOW(),'%Y-%m-%d'))
AND rutas.ano = '2009'
AND tarifas.mes='01'
AND idruta IN (SELECT tar2.idruta AS iditi FROM tarifas AS tar2 WHERE tar2.idruta='idruta' AND tar2.completo='0' AND tar2.mes='mestarifa')

GROUP BY rutas.id

ORDER BY flotas.nombre, rutas.ano, coches.nombre, rutas.nombre

Todo funciona correctamente excepto cuando he insertado estas dos partes:
(SELECT MIN(LEAST(if(tar.preciopromocion>0, tar.preciopromocion, 100000), if(tar.tarifa1>0, tar.tarifa1, 100000), if(tar.tarifa2>0, tar.tarifa2, 100000), if(tar.tarifa3>0, tar.tarifa3, 100000), if(tar.tarifa4>0, tar.tarifa4, 100000), if(tar.tarifa5>0, tar.tarifa5, 100000), if(tar.tarifa6>0, tar.tarifa6, 100000), if(tar.tarifa7>0, tar.tarifa7, 100000))) AS tarifamenor FROM tarifas AS tar WHERE tar.idruta='idruta' AND tar.mes='mestarifa') AS tarifamenos
que saca la menor de las tarifas distintas de cero

AND idruta IN (SELECT tar2.idruta AS iditi FROM tarifas AS tar2 WHERE tar2.idruta='idruta' AND tar2.completo='0' AND tar2.mes='mestarifa')
que no muestra las rutas completas.

La consulta tarda mucho en cargar y no da ningún resultado.
¿Me podeis ayudar en como hacerlo y darme algún consejillo que veais aconsejable?

Muchas Gracias
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

RE:¿Como arreglar esta consulta?

Publicado por soidito (8 intervenciones) el 11/08/2008 23:43:30
Yazo:

No sé cual sea el error pero sí te puedo dar dos consejos:

1.- No es necesario que antepongas el nombre de la tabla en cada campo com en el caso Coches.Nombre a menos que el nombre del campo esta tambien en otra tabla ahí sí será necesario para diferenciarlos

2.- Tampoco es necesario que les cambies el nombre de los campos como en el caso Coches.Nombre AS nombrecoche perfectamente puedes usar el nombre del campo original

3.- Lo que haces con esto es extender el texto de la consulta y como pudes apreciar se dificulta muchisimo la lectura, no digamos la comprensión

4.- Para tratar de entender mejor el texto de la consulta te aconsejo seccionarla

oRsDet:Source := "SELECT " +;
"detppn.*," +;
"hdrppn.hdr_can," +;
"hdrppn.hdr_fde," +;
"hdrppn.hdr_cpt," +;
"proveedor.pro_nom " + ;
"FROM " +;
"detppn," +;
"hdrppn," +;
"proveedor " +;
"WHERE " +;
"detppn.det_fol = hdrppn.hdr_fol " + ;
"AND " +;
"hdrppn.hdr_pro = proveedor.pro_pro " +;
"AND " +;
"! hdrppn.hdr_can " +;
"AND " +;
"detppn.det_pro = '" + cPro + "' " +;
"ORDER BY " +;
"detppn.det_prv," +;
"detppn.det_fol"

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