Ver Mensaje Individual
  #16 (permalink)  
Antiguo 19/08/2008, 14:27
yazo
 
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.