Comunidad de diseño web y desarrollo en internet online

Cruzar tablas

Citar            
MensajeEscrito el 16 Dic 2012 03:24 pm
Hola, tengo dos tablas a asaber:

Código MySQL :

CREATE TABLE IF NOT EXISTS `coeficientes` (
  `kmh` decimal(3,1) unsigned NOT NULL,
  `coeficiente` decimal(5,4) unsigned NOT NULL,
  PRIMARY KEY (`kmh`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;

--
-- Volcado de datos para la tabla `coeficientes`
--

INSERT INTO `coeficientes` (`kmh`, `coeficiente`) VALUES
(0.0, 0.0000),
(13.0, 0.0295),
(16.0, 0.0355),
(19.0, 0.0426),
(22.5, 0.0512),
(24.0, 0.0561),
(25.5, 0.0615),
(27.0, 0.0675),
(29.0, 0.0740),
(30.5, 0.0811),
(32.0, 0.0891),
(33.5, 0.0975),
(37.0, 0.1173),
(40.0, 0.1411);

y

Código MySQL :

CREATE TABLE IF NOT EXISTS `datos` (
  `salida_num` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `recorrido` varchar(30) COLLATE utf8_spanish2_ci NOT NULL,
  `tiempo` varchar(8) COLLATE utf8_spanish2_ci NOT NULL,
  `distancia` decimal(5,2) NOT NULL,
  `calorias` decimal(5,2) NOT NULL,
  `kmh` decimal(5,2) NOT NULL,
  PRIMARY KEY (`salida_num`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci AUTO_INCREMENT=12 ;

--
-- Volcado de datos para la tabla `datos`
--

INSERT INTO `datos` (`salida_num`, `recorrido`, `tiempo`, `distancia`, `calorias`, `kmh`) VALUES
(1, 'Casa-Blayet', '01:47:22', 36.37, 384.20, 20.32),
(2, 'Casa-El Perelló', '02:10:03', 44.76, 465.37, 20.65),
(3, 'Casa-El Perelló', '02:08:15', 44.76, 458.93, 20.94),
(4, 'Casa-El Perelló', '02:04:07', 44.76, 444.14, 21.64),
(5, 'Casa-El Recatí­', '01:50:53', 39.81, 396.78, 21.54),
(6, 'Casa-Barraca', '02:15:48', 49.78, 485.95, 21.99),
(7, 'Casa-Barraca', '02:10:38', 49.78, 561.83, 22.86),
(8, 'Casa-Blayet', '01:33:23', 36.37, 401.62, 23.37),
(9, 'Casa-Blayet', '01:32:25', 36.37, 397.47, 23.61),
(10, 'Casa-Blayet', '01:37:09', 36.37, 347.64, 22.46),
(11, 'Casa-Barraca', '02:06:12', 49.78, 542.76, 23.67);

Necesito sacar el coeficiente de la tabla "coeficientes" que tenga los kmh más próximos a los de la tabla datos, ya que es muy dificil que puedan coincidir.
¿Podéis explicarme como lo hago?. Gracias. :(

Por solilopi

16 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Dic 2012 09:39 pm
Existe una 'regla' que se llama BETWEEN , le encuentro mas utilidad el generar el coeficiente de manera dinamica (con php por ejemplo) y dar un rato real y no un aproximado

Por dsalcedo

50 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 17 Dic 2012 12:36 pm

dsalcedo escribió:

Existe una 'regla' que se llama BETWEEN , le encuentro mas utilidad el generar el coeficiente de manera dinamica (con php por ejemplo) y dar un rato real y no un aproximado

Probé el between pero, o no lo hice bien, o no me devolvió lo que yo quería.
Lo de generar el coeficiente de manera dinámica si me lo explicas(php) me harías un favor. Gracias.

Por solilopi

16 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 17 Dic 2012 05:24 pm
Me parece que la mejor forma de hacerlo es que en la tabla 'coefincientes' pongas además del dato en sí, el rango de distancias a la que afecta. Por ejemplo:

(13.0, 0.0295),

Pasaría a ser
INSERT INTO `coeficientes` (`kmh`, `coeficiente`, `desde`, `hasta`) VALUES
(0.0, 0.0000, 0, 7.0),
(13.0, 0.0295, 7.0, 14.5), ... etc...

Entonces en la sentencia SQL podrías buscar el coeficiente con mayor que, menor que.

SELECT * FROM `coeficientes` WHERE '20.32' <= `hasta` AND '20.32' >= `desde`.

Todo esto, por supuesto, asumiendo que los coeficientes no cambian con el tiempo.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 Dic 2012 07:45 pm
Como bien dice @DriverOp todo se asume que los coeficientes no cambian.

solilopi escribió:

Probé el between pero, o no lo hice bien, o no me devolvió lo que yo quería.
Lo de generar el coeficiente de manera dinámica si me lo explicas(php) me harías un favor. Gracias.


Que regla matematica usas para generar el coeficiente ? podrias escribirla ?

Por dsalcedo

50 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 18 Dic 2012 02:43 pm
La regla viene dada en unas tablas que encontré en la red. Si te interesan, busco y e paso el enlace, de todas formas yo tengo la tabla completa.
Bueno he creado la función siguiente:

Código MySQL :

DECLARE //
CREATE PROCEDURE inserciones (recorrido varchar(30),tempo varchar(8),
espacio decimal(5,2))
BEGIN
declare space decimal (7,2);
declare hora int(8);
declare minuto int(8);
declare segundo int(8);
declare resultado decimal(7,2);
declare calorias decimal(5.2);
declare operacion decimal(7.2);
set space = espacio*1000;
set hora = cast(substring(tempo,1,2)as unsigned);
set minuto = cast(substring(tempo,4,2)as unsigned);
set segundo = cast(substring(tempo,-2)as unsigned);
select coeficiente from coeficientes inner join datos where datos.kmh
between coeficientes.desde and coeficientes.hasta into operacion;
set calorias = (espacio*operacion*((hora*60)+minuto+(segundo/60)));
set hora = hora*3600;
set minuto = minuto*60;
set resultado = (space/(hora+minuto+segundo))*3.6;
insert into datos (recorrido,tiempo,distancia,calorias,kmh)
values (recorrido,tempo,espacio,calorias,resultado);

END //

Mi pregunta es, ¿Así calcularía bien las calorías y las insertaría en la Bd?. Gracias.

Por solilopi

16 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 20 Dic 2012 07:35 am
No funciona:

Código MySQL :

DELIMITER //

CREATE PROCEDURE inserciones (recorrido varchar(30),tempo varchar(8),
espacio decimal(5,2))
BEGIN
declare space decimal (7,2);
declare hora int(8);
declare minuto int(8);
declare segundo int(8);
declare resultado decimal(7,2);
declare calorias decimal(5.2);
declare operacion decimal(7.2);
set space = espacio*1000;
set hora = cast(substring(tempo,1,2)as unsigned);
set minuto = cast(substring(tempo,4,2)as unsigned);
set segundo = cast(substring(tempo,-2)as unsigned);

select min( coeficiente) from coeficientes inner join datos where datos.kmh
between coeficientes.desde and coeficientes.hasta into operacion;

set calorias = (85*operacion*((hora*60)+minuto+(segundo/60)));
set hora = hora*3600;
set minuto = minuto*60;
set resultado = (space/(hora+minuto+segundo))*3.6;

insert into datos (recorrido,tiempo,distancia,calorias,kmh)
values (recorrido,tempo,espacio,calorias,resultado);


END //

Me inserta el valor 0,0, sin embargo Mysql no se queja cuando la ejecuto. ¿Qué he hecho mal?. :?

Por solilopi

16 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 22 Dic 2012 02:52 pm
Hola de nuevo, he conseguido insertar en la bd pero lo que inserta no es correcto, el código que tengo ahora es:

Código MySQL :

DELIMITER //

CREATE PROCEDURE inserciones (recorrido varchar(30) charset utf8 ,tempo varchar(8) charset utf8,
espacio decimal(5,2) unsigned)
BEGIN
declare space decimal (7,2);
declare hora int(8);
declare minuto int(8);
declare segundo int(8);
declare resultado decimal(7,2) default 0.0;
declare calorias decimal(5,2) default 0.0;
declare operacion decimal(7,2) default 0.0;
set space = espacio*1000;
set hora = cast(substring(tempo,1,2)as unsigned);
set minuto = cast(substring(tempo,4,2)as unsigned);
set segundo = cast(substring(tempo,-2)as unsigned);

set hora = hora*3600;
set minuto = minuto*60;
set resultado = (space/(hora+minuto+segundo))*3.6;

select coeficiente from coeficientes where resultado
between desde and hasta into operacion;

set calorias = ((85*operacion)*((hora*60)+minuto+(segundo/60)));

insert into datos (recorrido,tiempo,distancia,calorias,kmh)
values (recorrido,tempo,espacio,calorias,resultado);


END //

Esto lo me me está haciendo ahora es insertar en el campo calorias el valor 999.99 que no corresponde con ningún coeficiente multiplicadoen la fórmula correspondiente. He hecho el select aparte y si devuelve el coeficiente bien, pero en el procedimiento no. ¿Podéis ayudarme?. Gracias.

Por solilopi

16 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Dic 2012 10:51 am
¡¡¡Solucionado!!! :lol:

Por solilopi

16 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.