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

¿Como arreglar esta consulta?

Estas en el tema de ¿Como arreglar esta consulta? en el foro de Mysql en Foros del Web. 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 ...

  #1 (permalink)  
Antiguo 11/08/2008, 14:10
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
¿Como arreglar esta consulta?

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

Última edición por yazo; 11/08/2008 a las 14:18
  #2 (permalink)  
Antiguo 12/08/2008, 01:44
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¿Alguien me puede ayudar?

Gracias aticipadas
  #3 (permalink)  
Antiguo 12/08/2008, 07:54
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

A lo mejor no se entiende muy bien alguna parte de la consulta, entre todas las tablas hay una llamada tarifas, que guarda las diferentes tarifas para una misma ruta, en un mismo mes una ruta puede tener varias salidas, las cuales pueden estar marcadas como completas o no.
Las demás tablas guardan información de las rutas, de las flotas,...
En esta consulta lo que quiero es sacar todas las rutas que tienen alguna ruta que no está completa y sacar de todas ellas el menor precio para ordenarlas por precio.

Si tenéis alguna otra duda yo os lo explico, esque estoy bloqueado y nose por donde seguir.

Muchas Gracias
  #4 (permalink)  
Antiguo 13/08/2008, 02:07
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Por favor, no se por donde seguir.
¿Me podéis ayudar u orientar un poquito?

Muchas Gracias
  #5 (permalink)  
Antiguo 14/08/2008, 09:58
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¡¡Estoy desesperado!! ¿Me podeis ayudar pliss?

Muchas gracias
  #6 (permalink)  
Antiguo 14/08/2008, 10:02
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: ¿Como arreglar esta consulta?

Hola yazo


Esto no me quedo claro
Cita:
(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
Si existe un valor menor de 100000 nunca se mostrará, ya que si hay valor 0 tomará el valor de 100000 y ese mandará, ¿eso es lo que quieres?

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #7 (permalink)  
Antiguo 14/08/2008, 10:05
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Cita:
Iniciado por Genetix Ver Mensaje
Hola yazo


Esto no me quedo claro


Si existe un valor menor de 100000 nunca se mostrará, ya que si hay valor 0 tomará el valor de 100000 y ese mandará, ¿eso es lo que quieres?

Saludos!
Es porque no se otra forma de ponerlo, teroricamente no tiene que haber ningún valor que llegue a 100000, si es cero pasa a la siguiente tarifa.

Muchas Gracias por contestar Genetix
  #8 (permalink)  
Antiguo 14/08/2008, 10:20
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: ¿Como arreglar esta consulta?

Prueba de esta manera
Código:
(SELECT @menor := LEAST(tar.preciopromocion, 
tar.tarifa1, 
tar.tarifa2, 
tar.tarifa3, 
tar.tarifa4,
tar.tarifa5,
tar.tarifa6,
tar.tarifa7),  
if(@menor>0,@menor,1000000) AS tarifamenor
FROM tarifas AS tar 
WHERE tar.idruta='idruta' 
AND tar.mes='mestarifa') AS tarifamenos
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #9 (permalink)  
Antiguo 14/08/2008, 11:02
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Gracias Genetrix

¿Habría alguna manera de poner la parte de if(@menor>0,@menor,1000000)?, la función es que coja la menor de todas las tarifas que sean mayores que cero.

Salu2
  #10 (permalink)  
Antiguo 15/08/2008, 03:04
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¿A alguien se le ocurre como solucionar esto?
AND idruta IN (SELECT tar2.idruta AS iditi FROM tarifas AS tar2 WHERE tar2.idruta='idruta' AND tar2.completo='0' AND tar2.mes='mestarifa')

Es la parte que me está dando problemas a la hora de que no me muestra ningún resultado, ¿porque puede ser?

Muchas Gracias
  #11 (permalink)  
Antiguo 15/08/2008, 03:12
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Ahh, se me ha olvidado.

He probado la consulta de que pasastes Genetrix y me sale @menor=0 y tarifamenor=1000000, supongo que será porque como hay tarifas que están a cero la coge esa como menor y luego al hacer la comparación se sale y coge la tarifa 1000000 ¿no?

Gracias de todas forma
  #12 (permalink)  
Antiguo 17/08/2008, 16:05
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¿A alguien más se le ocurre una solución al problema?

Gracias de ante mano por vuestras respuestas.
  #13 (permalink)  
Antiguo 19/08/2008, 10:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ¿Como arreglar esta consulta?

Al igual que Genetix, no entiendo una parte de la consulta. Y aunque no estoy seguro de lo que voy a sugerirte, empezaré por aquí.

¿Por qué una subconsulta, si las tarifas están relacionadas con las rutas o con los meses (no sé cómo has hecho la relación)... yo quitaría el SELECT... de esa subconsulta sobre el precio mínimo de las tarifas. Creo que el GROUP BY te sirve para todo, incluido esto, y que las condiciones del WHERE ya las tenías establecidas para las rutas, por lo que no serían necesarias otra vez en la subconsulta, según creo. Pon sólo tras tarifas.mes as mestarifa una coma como un dato más y antes del FROM...
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

A ver si con eso empezamos a ver algo de luz

En cuanto a lo otro que preguntas:
AND idruta IN (SELECT tar2.idruta AS iditi FROM tarifas AS tar2 WHERE tar2.idruta='idruta' AND tar2.completo='0' AND tar2.mes='mestarifa')
imagino que 'idruta', 'mestarifa', etc. son variables. Has hecho directamente las consultas con una idruta concreta y un mes concreto, es decir, AND idruta IN (SELECT tar2.idruta AS iditi FROM tarifas AS tar2 WHERE tar2.idruta= 1 AND tar2.completo='0' AND tar2.mes=11)

No sé cómo te traes el mes y tampoco sabemos lo que es tar2.completo para ayudarte, pero debes probar sustituyendo variables o términos por datos concretos que sepas que están en la base.

Última edición por jurena; 19/08/2008 a las 10:49
  #14 (permalink)  
Antiguo 19/08/2008, 11:16
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Gracias por la respuesta jurena.

La cuestión por la que he puesto una subconsulta es porque una misma ruta en un mes puede tener varías tarifas dependiendo del día, y para cada día hay 7 tarifas diferentes, lo que necesito es por ejemplo, si consulto un mes especifico, poder sacar la menor de las tarifas de todas las fechas de dicho mes, y con la subconsulta miro cual de todas las que tengan ese idruta en ese mes cual es la más barata. ¿habría alguna forma de hacerso sin subconsulta?

Por otro lado lo de revisar los completos es por lo mismo, ya que en un mes puede haber por ejemplo 5 tarifas (salidas) y 3 de ellas completas, lo que quiero es sacar en la consulta general todas aquellas que tengan por lo menos una tarifa (salida) disponible, para ello lo que hago es que consulte el mes y la idruta de la consulta general en la subconsulta para ver si esa ruta en ese mes tiene alguna salida disponible.

Salu2
  #15 (permalink)  
Antiguo 19/08/2008, 12:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ¿Como arreglar esta consulta?

yazo,
creo que necesitamos datos (al menos, yo), e incluso sería deseable que nos proporcionases la estructura de tu base, con sus tablas y algún dato para que podamos hacer pruebas. Tampoco estaría demás un ejemplo concreto, por ejemplo, para una ruta concreta, en un mes concreto debería salir la tarifa x, pero todo ello con datos concretos. Exporta, si no tienes inconveniente, tu base con algunos datos mediante PHPMyAdmin y luego abre ese texto y copianos el contenido de ese archivo en el post para que podamos crearla en las mismas condiciones que la tienes tú. Con eso y los datos concretos quizás podamos ayudarte algo más...
  #16 (permalink)  
Antiguo 19/08/2008, 14:27
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Hola jurena,

Siguiendo tu consejo os publico un ejemplo de la base de datos y de una consulta.

La base de datos es la siguiente:
Código:
-- 
-- Estructura de tabla para la tabla `coches`
-- 

CREATE TABLE `coches` (
  `id` int(11) NOT NULL auto_increment,
  `nombre` varchar(255) collate latin1_spanish_ci NOT NULL default '',
  `fotocoche` varchar(255) collate latin1_spanish_ci NOT NULL,
  `videocoche` varchar(255) collate latin1_spanish_ci NOT NULL,
  `oculto` tinyint(4) NOT NULL default '0',
  `idflota` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci AUTO_INCREMENT=10 ;

-- 
-- Volcar la base de datos para la tabla `coches`
-- 

INSERT INTO `coches` VALUES (1, 'Coche 1', 'foto1.jpg', 'http://www.youtube.com/v/V7f5YDeI_UY', 0, 1);
INSERT INTO `coches` VALUES (2, 'Coche 2', 'foto2.jpg', 'http://www.youtube.com/v/dfghdfgh', 0, 1);
INSERT INTO `coches` VALUES (3, 'Coche 3', 'foto3.jpg', 'http://www.youtube.com/v/A-dfghdfgh', 0, 1);
INSERT INTO `coches` VALUES (4, 'Coche 4', 'foto4.jpg', 'http://www.youtube.com/v/hghdgfhd', 0, 2);
INSERT INTO `coches` VALUES (5, 'Coche 5', 'foto5.jpg', '', 0, 2);

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `flotas`
-- 

CREATE TABLE `flotas` (
  `id` int(11) NOT NULL auto_increment,
  `nombre` varchar(255) NOT NULL default '',
  `logotipo` varchar(255) NOT NULL default '',
  `oculto` tinyint(4) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- 
-- Volcar la base de datos para la tabla `flotas`
-- 

INSERT INTO `flotas` VALUES (1, 'FLOTA 1', 'logotipo1.jpg', 0);
INSERT INTO `flotas` VALUES (2, 'FLOTA 2', 'logotipo2.jpg', 0);

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `rutas`
-- 

CREATE TABLE `rutas` (
  `id` int(11) NOT NULL auto_increment,
  `nombre` text collate latin1_general_ci NOT NULL,
  `idflota` int(11) NOT NULL default '0',
  `idcoche` int(11) NOT NULL default '0',
  `ano` int(11) NOT NULL default '0',
  `opciones` varchar(50) collate latin1_general_ci NOT NULL default '',
  `destino` int(11) NOT NULL,
  `oculto` tinyint(4) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=10 ;

-- 
-- Volcar la base de datos para la tabla `rutas`
-- 

INSERT INTO `rutas` VALUES (1, 'NOMBRE RUTA 1', 1, 1, 2008, 'nada', 5, 0);
INSERT INTO `rutas` VALUES (2, 'NOMBRE RUTA 2', 1, 1, 2008, 'nada', 5, 0);
INSERT INTO `rutas` VALUES (3, 'NOMBRE RUTA 3', 1, 2, 2008, 'vth', 5, 0);
INSERT INTO `rutas` VALUES (4, 'NOMBRE RUTA 4', 1, 3, 2008, 'vth', 5, 0);
INSERT INTO `rutas` VALUES (5, 'NOMBRE RUTA 5', 2, 4, 2008, 'vth', 6, 0);
INSERT INTO `rutas` VALUES (6, 'NOMBRE RUTA 6', 2, 4, 2008, 'vi', 6, 0);
INSERT INTO `rutas` VALUES (7, 'NOMBRE RUTA 7', 2, 5, 2008, 'nada', 6, 0);

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `tarifas`
-- 

CREATE TABLE `tarifas` (
  `id` int(11) NOT NULL auto_increment,
  `dia` varchar(11) collate latin1_general_ci NOT NULL default '0',
  `mes` varchar(11) collate latin1_general_ci NOT NULL default '0',
  `tarifa1` int(11) NOT NULL default '0',
  `tarifa2` int(11) NOT NULL default '0',
  `tarifa3` int(11) NOT NULL default '0',
  `tarifa4` int(11) NOT NULL default '0',
  `tarifa5` int(11) NOT NULL default '0',
  `tarifa6` int(11) NOT NULL default '0',
  `tarifa7` int(11) NOT NULL default '0',
  `completo` tinyint(50) NOT NULL default '0',
  `promocion` tinyint(50) NOT NULL default '0',
  `preciopromocion` int(11) NOT NULL default '0',
  `precioinicial` int(11) NOT NULL default '0',
  `idruta` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=20 ;

-- 
-- Volcar la base de datos para la tabla `tarifas`
-- 

INSERT INTO `tarifas` VALUES (1, '13', '10', 0, 5386, 5949, 7730, 0, 0, 0, 0, 1, 5386, 7695, 1);
INSERT INTO `tarifas` VALUES (2, '19', '10', 1726, 2067, 2541, 3623, 0, 0, 0, 0, 1, 1726, 2218, 1);
INSERT INTO `tarifas` VALUES (3, '09', '01', 1726, 2067, 2541, 3623, 0, 0, 0, 0, 1, 1726, 2218, 2);
INSERT INTO `tarifas` VALUES (4, '22', '01', 1726, 2067, 2541, 3623, 0, 0, 0, 0, 1, 1726, 2218, 2);
INSERT INTO `tarifas` VALUES (5, '25', '01', 505, 611, 741, 960, 0, 0, 0, 0, 1, 505, 839, 2);
INSERT INTO `tarifas` VALUES (6, '11', '02', 505, 611, 741, 960, 0, 0, 0, 0, 1, 505, 839, 3);
INSERT INTO `tarifas` VALUES (7, '18', '02', 425, 611, 741, 960, 0, 0, 0, 0, 1, 505, 839, 3);
INSERT INTO `tarifas` VALUES (8, '25', '03', 505, 611, 741, 960, 0, 0, 0, 0, 1, 505, 839, 3);
INSERT INTO `tarifas` VALUES (9, '01', '02', 540, 645, 876, 995, 0, 0, 0, 0, 1, 540, 865, 4);
INSERT INTO `tarifas` VALUES (10, '08', '02', 575, 680, 901, 1030, 0, 0, 0, 0, 1, 575, 900, 4);
INSERT INTO `tarifas` VALUES (11, '15', '02', 680, 785, 1006, 1135, 0, 0, 0, 0, 1, 680, 1005, 4);
INSERT INTO `tarifas` VALUES (12, '22', '02', 575, 680, 901, 1030, 0, 0, 0, 0, 1, 575, 900, 4);
INSERT INTO `tarifas` VALUES (13, '01', '03', 575, 680, 901, 1030, 0, 0, 0, 0, 1, 575, 900, 4);
INSERT INTO `tarifas` VALUES (14, '08', '03', 610, 715, 936, 1065, 0, 0, 0, 0, 1, 610, 935, 4);
INSERT INTO `tarifas` VALUES (15, '15', '03', 510, 715, 936, 1065, 0, 0, 0, 0, 1, 610, 935, 4);
INSERT INTO `tarifas` VALUES (16, '22', '03', 610, 715, 936, 1065, 0, 0, 0, 0, 1, 610, 935, 4);
INSERT INTO `tarifas` VALUES (17, '29', '03', 610, 715, 936, 1065, 0, 0, 0, 0, 1, 610, 935, 4);
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 = '5'
AND TIMESTAMP(CONCAT(rutas.ano, '-', tarifas.mes, '-', tarifas.dia)) >= TIMESTAMP(DATE_FORMAT(NOW(),'%Y-%m-%d'))
AND rutas.ano = '2008'
AND tarifas.mes='03'
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


El resultado de esta consulta debería ser:
Saca las rutas 3 (precio 505) y 4 (precio 510) con todas sus fechas, ya que no hay ninguna fecha completa, pero si por ejemplo marcamos como completa la tarifa con id 8, solo saldría la ruta 4.

Si queréis que os explique algo más me avisáis.

Gracias anticipadas.
  #17 (permalink)  
Antiguo 22/08/2008, 02:51
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Hola chicos,

¿Habéis conseguido algo con la consulta? Estoy bloqueadisimo, nose por donde tirar.

Gracias
  #18 (permalink)  
Antiguo 22/08/2008, 04:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ¿Como arreglar esta consulta?

Yazo,
dinos qué quieres sacar exactamente con la consulta. Algo así, como: quiero encontrar todos los coches de la flota que sea para la ruta que sea en una fecha con la tarifa más barata para esa fecha... Tal vez así nos sea más fácil.
  #19 (permalink)  
Antiguo 22/08/2008, 10:49
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

La consulta en realidad parece bastante sencilla, pero a la hora de hacerla se complica jejeje.

Lo que estoy intentado es sacar las rutas con por ejemplo destino=5, en el mes=3, y el año=2008, después de cada ruta sacar la siguiente información (para hacer una especie de ficha de cada ruta):
  • datos y logotipos del coche y flota de dicha ruta.
  • menor precio de todas las tarifas disponibles en ese mes y ano para esa ruta, siempre que sean distintas de cero, es decir la menor de todas ellas distinta de cero., es decir, si me dan las tarifas 10, 12, 5, 0 sacaría 5.

Como condición deben cumplir:
  • No sacar ninguna ruta con todas las fechas con completo=1, es decir, una ruta en un mes puede tener varias salidas, y solo hay que mostrar las rutas que tengan por lo menos una fecha que no esté completa.
  • No sacar ninguna ruta cuyas fechas sean inferiores a la fecha actual.
  • No sacar ninguna ruta o flota con oculto=0.

Haber si con esto sois capaces de conseguir algo, porque yo estoy más perdido que un pulpo en un garaje .

Gracias
  #20 (permalink)  
Antiguo 22/08/2008, 11:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ¿Como arreglar esta consulta?

Lanza esta consulta:
SELECT * , f.id AS idflota, f.nombre AS nombreflota, f.logotipo AS logoflota, c.id AS idcoche, c.nombre AS nombrecoche, c.fotocoche AS fotocoche, c.videocoche AS videocoche, r.nombre AS nombreruta, r.id AS idruta, r.ano AS anoruta, r.opciones AS opcionesruta, tar.mes AS mestarifa, 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 rutas r
INNER JOIN tarifas tar ON tar.idruta = r.id
INNER JOIN flotas f ON f.id = r.idflota
INNER JOIN coches c ON c.idflota = f.id
WHERE r.id =1
AND tar.mes LIKE '10'
AND r.ano =2008
AND tar.completo !=1
AND r.oculto !=0
AND f.oculto !=0
AND TIMESTAMP( CONCAT( r.ano, '-', tar.mes, '-', tar.dia ) ) >= now( )
GROUP BY tar.id ORDER BY f.nombre, r.ano, c.nombre, r.nombre



Ojo, ten cuidado cuando hagas pruebas con las fechas, pues no puedes pedir que la fecha sea el mes 03 del ano 2008 y exigir a la vez que sea posterior al día de hoy: es lo que estabas haciendo... Para resolver el tema he puesto como mes para varias tarifas el 10. Te he puesto tras el select un asterisco, algo que es una barbaridad, pero lo he puesto para que puedas comprobar los datos visualmente en estas pruebas.

Última edición por jurena; 22/08/2008 a las 12:01
  #21 (permalink)  
Antiguo 24/08/2008, 15:51
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Gracias por tu respuesta jurena, he estado realizando pruebas y parece que va correcto, aunque hay tres cosillas que nose porque las has puesto asi:
- porque usas like al comparar el mes.
- en la primera condicion del where ¿porque pones r.id=1?
- en el group lo he cambiado por tar.idruta para que me agrupe las rutas.

Pero vamos que como siempre un 10, muchisimas gracias por la ayuda.
  #22 (permalink)  
Antiguo 26/08/2008, 10:09
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Hola,

Añadiendo a las preguntas anteriores ¿habría alguna forma de saber el id de la tarifa menor?

Gracias
  #23 (permalink)  
Antiguo 27/08/2008, 17:22
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¿Como podría sacar un historial de las rutas? es decir, un listado como el anterior pero con todas las fechas que ya hayan pasado.

He probado con:

SELECT * , f.id AS idflota, f.nombre AS nombreflota, f.logotipo AS logoflota, c.id AS idcoche, c.nombre AS nombrecoche, c.fotocoche AS fotocoche, c.videocoche AS videocoche, r.nombre AS nombreruta, r.id AS idruta, r.ano AS anoruta, r.opciones AS opcionesruta, tar.mes AS mestarifa, 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 rutas r
INNER JOIN tarifas tar ON tar.idruta = r.id
INNER JOIN flotas f ON f.id = r.idflota
INNER JOIN coches c ON c.idflota = f.id
WHERE r.id =1
AND tar.mes LIKE '10'
AND r.ano =2008
AND tar.completo !=1
AND r.oculto !=0
AND f.oculto !=0
AND TIMESTAMP( CONCAT( r.ano, '-', tar.mes, '-', tar.dia ) ) < now( )
GROUP BY tar.id ORDER BY f.nombre, r.ano, c.nombre, r.nombre


Pero este me saca los circuitos que tienen una fecha que disponible.

Tambien he intentado con MINUS:
SELECT * , f.id AS idflota, f.nombre AS nombreflota, f.logotipo AS logoflota, c.id AS idcoche, c.nombre AS nombrecoche, c.fotocoche AS fotocoche, c.videocoche AS videocoche, r.nombre AS nombreruta, r.id AS idruta, r.ano AS anoruta, r.opciones AS opcionesruta, tar.mes AS mestarifa, 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 rutas r
INNER JOIN tarifas tar ON tar.idruta = r.id
INNER JOIN flotas f ON f.id = r.idflota
INNER JOIN coches c ON c.idflota = f.id
WHERE r.id =1
AND tar.mes LIKE '10'
AND r.ano =2008
AND tar.completo !=1
AND r.oculto !=0
AND f.oculto !=0
GROUP BY tar.id ORDER BY f.nombre, r.ano, c.nombre, r.nombre

MINUS

SELECT * , f.id AS idflota, f.nombre AS nombreflota, f.logotipo AS logoflota, c.id AS idcoche, c.nombre AS nombrecoche, c.fotocoche AS fotocoche, c.videocoche AS videocoche, r.nombre AS nombreruta, r.id AS idruta, r.ano AS anoruta, r.opciones AS opcionesruta, tar.mes AS mestarifa, 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 rutas r
INNER JOIN tarifas tar ON tar.idruta = r.id
INNER JOIN flotas f ON f.id = r.idflota
INNER JOIN coches c ON c.idflota = f.id
WHERE r.id =1
AND tar.mes LIKE '10'
AND r.ano =2008
AND tar.completo !=1
AND r.oculto !=0
AND f.oculto !=0
AND TIMESTAMP( CONCAT( r.ano, '-', tar.mes, '-', tar.dia ) ) >= now( )
GROUP BY tar.id ORDER BY f.nombre, r.ano, c.nombre, r.nombre


Pero he leido que minus en mysql no funciona.

¿Que alternativas me recomendais?

Muchas Gracias
  #24 (permalink)  
Antiguo 02/09/2008, 10:34
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¿Alguien me puede ayudar? o al menos decirme como hacer una alternativa al MINUS.

Muchas Gracias
  #25 (permalink)  
Antiguo 02/09/2008, 10:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ¿Como arreglar esta consulta?

Yazo,
dinos exactamente qué quieres sacar para usar el minus. Sé concreto, pues ya viste que tu post 19 nos ayudó, al menos a mí, más que ningún otro a saber lo que quieres.
  #26 (permalink)  
Antiguo 09/09/2008, 11:00
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Perdonad por no haber podido contestar antes a los mensajes, he estado fuera.

Lo que estoy intentando es sacar un historias de todas las rutas.

El historial sacaría todas las rutas que tengan todas las salidas (tarifa) de dicha ruta ya pasada, la tabla tarifas tiene un campo llamado dia y otro llamado mes, la tabla turas tiene un campo llamado ano.

Gracias de antemano.
  #27 (permalink)  
Antiguo 14/09/2008, 13:22
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¿Alguien me puede ayudar?
¿Se os ocurre alguna solución?

Muchas Gracias
  #28 (permalink)  
Antiguo 15/09/2008, 09:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ¿Como arreglar esta consulta?

No sé cuál es tu problema, pero
SELECT * , f.id AS idflota, f.nombre AS nombreflota, f.logotipo AS logoflota, c.id AS idcoche, c.nombre AS nombrecoche, c.fotocoche AS fotocoche, c.videocoche AS videocoche, r.nombre AS nombreruta, r.id AS idruta, r.ano AS anoruta, r.opciones AS opcionesruta, tar.mes AS mestarifa, 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 rutas r
INNER JOIN tarifas tar ON tar.idruta = r.id
INNER JOIN flotas f ON f.id = r.idflota
INNER JOIN coches c ON c.idflota = f.id
WHERE r.id =1
AND tar.completo !=1
AND r.oculto !=0
AND f.oculto !=0
AND TIMESTAMP( CONCAT( r.ano, '-', tar.mes, '-', tar.dia ) ) < now( )
GROUP BY tar.id ORDER BY f.nombre, r.ano, c.nombre, r.nombre

Cuidado que yo uso tar.id y no tar.idruta... He mantenido las condiciones del WHERE, pero tú deberías quitar las que no quieras que se cumplan. Por supuesto, he quitado la de la fecha... Y si me preguntas por qué r.id = 1, porque en este foro no podemos poner variables, sino datos constantes como ese 1 (imagino que tendrás una ruta cuyo id es 1). Por otra parte, me preguntabas por qué usaba like. La verdad es que podrías poner igualmente =, pero con ello quería recordarte que estás usando números de mes 02, 03, etc., como cadenas de caracteres.

Esto busca lo anterior a la fecha actual, pero no sé si es lo que quieres.
  #29 (permalink)  
Antiguo 16/09/2008, 02:36
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

Gracias por tu respuesta jurena.

He probado el código pero me saca rutas que tienen alguna ruta ya pasada.
La intención de este código es que en el administrador tenga un acceso a las rutas que tengan todas las salidas (tarifas) ya pasadas, es decir, sacar todas las rutas que tengan todas las tarifas ya pasadas. Con este código saca también alguna de las rutas que tienen una o dos salidas ya pasadas, pero que también tienen rutas disponibles.

Gracias por las respuestas
  #30 (permalink)  
Antiguo 24/09/2008, 02:19
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: ¿Como arreglar esta consulta?

¿Alguien me puede ayudar?
Sigo bloqueado con este tema y no se por donde seguir.

Muchas Gracias
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 14:51.