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

Crear consultas para base de datos Mysql

Estas en el tema de Crear consultas para base de datos Mysql en el foro de Mysql en Foros del Web. Soy primerizo en esto de las bases de datos, mi duda si podriais ayudarme con esto: Mi duda es la siguiente, partiendo de la base ...
  #1 (permalink)  
Antiguo 30/01/2015, 12:49
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Crear consultas para base de datos Mysql

Soy primerizo en esto de las bases de datos, mi duda si podriais ayudarme con esto:

Mi duda es la siguiente, partiendo de la base de datos con las siguientes entidades:

CONDUCTOR(DNI, NOMBRE, DIREC,PROV)
VEHICULO(MATRICULA, CARGAMAX, FECHACOMPRA)
RUTA(RUTA#, CIUDADSAL,CIUDADLLEG, KM)
VIAJE_PROGRAMADO(VIAJE#, RUTA#, FECHASAL, HORASAL, FECHALLEG, HORALLEG) primero los viajes se programan y posteriormente se asignan
VIAJE_ASIGNADO(VIAJE#, DNI, MATRICULA) los viajes son asignados a una persona, DNI, que llevará un vehículo, MATRICULA
(Las llaves principales son el primer dato de cada entidad y las almohadillas representan llave externa)


Pues quiero realizar las siguientes consultas:

1.Ciudades entre las que se haya programado el viaje de mayor duración junto con el vehículo y dni del conductor que lo hizo,
2.DNI y nombre de los conductores que hayan llevado todos los camiones de la empresa y número de rutas realizados por él con la empresa.
3.Dias de la semana que se hayan hecho viajes entre Granada y Sevilla por la mañana (salida y llegada antes de las 13 h) de un mismo dia.
4.Rutas en las que hayan hecho viajes de más de dos días.
5.Matriculas de todos los vehiculos en la que tambien aparezcan los datos del viaje de mayor duracion en dias realizado por ese vehiculo y el conductor que lo hizo.
6.Conductores que hayan realizado todos los trayectos de la tabla RUTA.
7.Conductores que hayan realizado el mayor numero de kilometros y días totales de trabajo de cada uno de esos conductores.
8.Camiones que hayan sido conducidos por un unico conductor.

Tengo la base creada, los datos insertados, pero no se como hacer esas consultas.
Ayuda por favor.
Gracias de antemano
  #2 (permalink)  
Antiguo 30/01/2015, 12:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Esto suena demasiado a trabajo práctico...



Empieza con las que puedas resolver. Y dinos qué dudas tienes con las que no puedes.
No te olvides que la idea de este foro es ayudar a desarrolladores, no hacer las tareas de escuela. Lo que sí podemos hacer es guiarte en base a lo que hayas intentado.

Empieza y veremos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 30/01/2015, 13:01
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

No sabía que el foro era para desarrolladores, perdone las molestias.
Asi como dices, pertenece a una practica, pero hemos dado apenas 5 clases de sql, con esto de ser una optativa en mi carrera y eso..
Y el ejercicio en sí es mas largo, pero son las consultas con lo que me atraganto, por la poca practica que hemos dado acerca del tema.
Apenas paso del "SELECT * FROM" y claro, se hace cuesta arriba.
He buscado información en internet, y llevo como 2 dias intentando hacer consultas, pero no logro avanzar nada..
Nose, por ejemplo, restar fechas. Ni como restar exactamente las fechas "FechaSalida-FechaLlegada"
Tampoco se contar los días, ni la cantidad de viajes que ha dado un conductor.
Como digo, hemos tocado sql por encima, y solo con un ejemplo particular, lo cual hace dificil el trabajo
  #4 (permalink)  
Antiguo 30/01/2015, 13:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Cita:
y llevo como 2 dias intentando hacer consultas, pero no logro avanzar nada..
Muestranos las pruebas que hiciste.

Te insisto en que sin intentos, no se aprende. Y como por politica no hacemos tareas para otros (a nosotros ya nos tocó, y lo hicimos), podemos guiarte, pero no desde la nada.

Postea los intentos de cada caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 31/01/2015, 05:02
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

1-
Código SQL:
Ver original
  1. SELECT CIUDADSALIDA,CIUDADLLEGADA,DNI,MATRICULA
  2. FROM VIAJE_ASIGNADO,RUTA
  3. WHERE VIAJE=(SELECT VIAJE
  4.             FROM VIAJE_PROGRAMADO
  5.             WHERE datediff(FECHASALIDA,FECHALLEGADA)>= ALL(
  6.                     SELECT datediff(FECHASALIDA,FECHALLEGADA)
  7.                     FROM VIAJE_PROGRAMADO;)
  8.             );

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

2-
Código SQL:
Ver original
  1. CREATE VIEW t1 AS SELECT DISTINCT MATRICULA FROM VEHICULO;
  2. CREATE VIEW t2 AS SELECT DISTINCT DNI FROM CONDUCTOR;
  3.  
  4. SELECT t2.DNI,t1.NOMBRE
  5.  
  6.  
  7. SELECT DNI,NOMBRE
  8. FROM CONDUCTOR, VIAJE_ASIGNADO
  9. WHERE VIAJE= (SELECT VIAJE
  10.         FROM VIAJE_ASIGNADO
  11.         WHERE (DNI,MATRICULA)= ALL(SELECT DNI,MATRICULA
  12.                 FROM CONDUCTOR
  13.             ));
#Dos formas pero no llego a ninguna solucion

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

4-
Código SQL:
Ver original
  1. SELECT *
  2. FROM RUTA
  3. WHERE RUTA=(SELECT RUTA
  4.         FROM VIAJE_PROGRAMADO
  5.         WHERE datediff(FECHASALIDA,FECHALLEGADA)>2);
  6. #mirar horas y q devuelve datediff
-------------------------------------

5-
Código SQL:
Ver original
  1. SELECT MATRICULA,DNI,VIAJE,RUTA,datediff(FECHASALIDA,FECHALLEGADA)
  2. FROM VIAJE_ASIGNADO,VIAJE_PROGRAMADO
  3. WHERE (datediff(FECHASALIDA,FECHALLEGADA))>
  4.             (SELECT datediff(FECHASALIDA,FECHALLEGADA)
  5.             FROM VIAJE_PROGRAMADO);
  6. #no sabemos q devuelve datediff

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

6-
Código SQL:
Ver original
  1. SELECT DNI
  2. FROM CONDUCTOR;
  3. INTERSECT
  4. SELECT DNI
  5. FROM CONDUCTOR
  6. WHERE (comprobar las rutas);

-------------------------------------
8-
Código SQL:
Ver original
  1. SELECT *
  2. FROM VEHICULO
  3. WHERE MATRICULA=(SELECT MATRICULA
  4.             FROM VIAJE_ASIGNADO
  5.             WHERE DNI=(SELECT DISTINCT(DNI)
  6.                     FROM CONDUCTOR
  7.                 ));

Última edición por gnzsoloyo; 31/01/2015 a las 07:19
  #6 (permalink)  
Antiguo 31/01/2015, 07:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Dejame que lo analice para poder darte una respuesta adecuada.
Lo estoy viendo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 31/01/2015, 08:10
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

De acuerdo, muchas gracias
El 3 y 7 directamente nose como meterle mano
Tambien se que en uno de ellos debo ejecutar un "count", para contar el numero de rutas que coge un determinado conductor, pero hemos dado muy poco contenido de sql y estoy muy verde..

Última edición por lulier19; 31/01/2015 a las 09:04
  #8 (permalink)  
Antiguo 31/01/2015, 15:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Bueno, recién ahora la cosa se pone interesante. SIn códigos es todo muy aburrido.... Lo siente.

Para poder entender como se resuelven las cosas en BBDD y SQL, tienes que razonar de modo algo diferente a lo que haces en programación. Eso tenlo presente porque es una de las primeras reglas que te enseñan en la asignatura, cuando la cursas en la universidad. Y es cierto.
No empieces tratando de resolver todo el problema, como si se tratase de un proceso que hay que resolver. No existe tal.
Empieza siempre por separar los bloques de información que se indican, de modo que queden los conceptos simples. Esto quiere decir que primero debes ver que bloques de datos que intervienen en la consulta pueden ser obtenidos en consultas de menor complejidad.

Vamos a los problemas y las soluciones que planteas, para que se entienda la idea.

El primero dice así:
Cita:
Ciudades entre las que se haya programado el viaje de mayor duración junto con el vehículo y dni del conductor que lo hizo,
En este caso te piden tres cosas claras: a) Ciudades relacionadas con viajes; b) viaje más largos de todos, y c) conductores con sus DNI.

No pienses la consulta completa. Piensa cada parte de eso.

Voy a comenzar creando las tablas a partir de tu descripción pero las voy a normalizar un poco por necesidades de simpleza de consultas.

Código MySQL:
Ver original
  1. CREATE TABLE CONDUCTOR(
  2.     NOMBRE VARCHAR (30) NOT NULL,
  3.     DIREC VARCHAR (150) NOT NULL,
  4.     PROV_ID INT UNSIGNED NOT NULL);
  5. CREATE TABLE VEHICULO(
  6.     MATRICULA VARCHAR(10) NOT NULL PRIMARY KEY,
  7.     CARGAMAX MEDIUMINT UNSIGNED NOT NULL,
  8.     FECHACOMPRA DATE NOT NULL);
  9.     RUTA_ID INT UNSIGNED NOT NULL PRIMARY KEY,
  10.     CIUDADSAL_ID MEDIUMINT UNSIGNED NOT NULL,
  11.     CIUDADLLEG_ID MEDIUMINT UNSIGNED NOT NULL,
  12.     KM DECIMAL (14,2) NOT NULL);
  13. CREATE TABLE VIAJE_PROGRAMADO(
  14.     VIAJE_ID INT UNSIGNED NOT NULL PRIMARY KEY,
  15.     RUTA_ID INT UNSIGNED NOT NULL,
  16.     FECHASAL DATE NOT NULL,
  17.     HORASAL TIME NOT NULL,
  18.     FECHALLEG DATE NOT NULL,
  19.     HORALLEG TIME NOT NULL);
  20. CREATE TABLE VIAJE_ASIGNADO(
  21.     VIAJE_ID INT UNSIGNED NOT NULL,
  22.     DNI INT UNSIGNED NOT NULL,
  23.     MATRICULA VARCHAR(10),
  24.     PRIMARY KEY(VIAJE_ID, DNI, MATRICULA));
  25.  
  26. # Tablas de uso recomendado.
  27. CREATE TABLE CIUDAD(
  28.     CIUDAD_ID INT UNSIGNED NOT NULL PRIMARY KEY,
  29.     PROV_ID INT UNSIGNED NOT NULL,
  30.     NOMBRE_CIUDAD VARCHAR(150) NOT NULL);
  31.  
  32. CREATE TABLE PROVINCIA(
  33.     PROV_ID INT UNSIGNED NOT NULL PRIMARY KEY,
  34.     NOMBRE_CIUDAD VARCHAR(150) NOT NULL);
No uses "#" para los nombres de objetos, es el caracter de remark o comentario y puede causar problemas en algun momento.

Caso 1) Ciudades entre las que se haya programado el viaje de mayor duración junto con el vehículo y dni del conductor que lo hizo,

Veamos lo simple: viajes de mayor duración:
Código MySQL:
Ver original
  1. SELECT viaje_id
  2.     SELECT
  3.         viaje_id,
  4.         (TIMESTAMPDIFF(MINUTE, adddate(fechasal, horasal), adddate(fechalleg, horalleg))) duracion
  5.     FROM VIAJE_ASIGNADO) viajes
  6. HAVING duracion = MAX(duracion);
En principio el having debería funcionar bien en mi experiencia, pero hay otras formas de escribir esa consulta, aunque algo más complejas.
Luego vamos a las egunda parte: Viaje asignado, con su chofer y ciudad.

Código MySQL:
Ver original
  1. SELECT VP.viaje_id, CO.dni DocConductor, CO.nombre NombreConductor, C1.nombre Origen, C2.nombre Destino
  2. FROM viaje_asignado VA
  3.     INNER JOIN viaje_programado VP ON VA.viaje_id = VP.viaje_id
  4.     INNER JOIN ruta R ON VP.ruta_id = R.ruta_id
  5.     INNER JOIN ciudad C1 ON R.ciudad_sal = C1.ciudad_id
  6.     INNER JOIN ciudad C2 ON R.ciudad_lleg = C2.ciudad_id
  7.     INNER JOIN conductor CO ON VA.dni = CO.dni;
Es una consulta algo compleja como primer ejercicio de SQL, eso te lo concedo. Quien te lo dio así está un poco alterado de las neuronas.

A esto hay que agregarle el filtrado anterior:

Código MySQL:
Ver original
  1. WHERE VP.iaje_id IN (SELECT viaje_id
  2.                     FROM (
  3.                     SELECT
  4.                             viaje_id,
  5.                             (TIMESTAMPDIFF(MINUTE, adddate(fechasal, horasal), adddate(fechalleg, horalleg))) duracion
  6.                         FROM VIAJE_ASIGNADO) viajes
  7.                     HAVING duracion = MAX(duracion));

Con lo que al final podría funcionar así:

Código MySQL:
Ver original
  1. SELECT VP.viaje_id, CO.dni DocConductor, CO.nombre NombreConductor, C1.nombre Origen, C2.nombre Destino
  2. FROM viaje_asignado VA
  3.     INNER JOIN viaje_programado VP ON VA.viaje_id = VP.viaje_id
  4.     INNER JOIN ruta R ON VP.ruta_id = R.ruta_id
  5.     INNER JOIN ciudad C1 ON R.ciudad_sal = C1.ciudad_id
  6.     INNER JOIN ciudad C2 ON R.ciudad_lleg = C2.ciudad_id
  7.     INNER JOIN conductor CO ON VA.dni = CO.dni
  8. WHERE VP.iaje_id IN (SELECT viaje_id
  9.                     FROM (
  10.                     SELECT
  11.                             viaje_id,
  12.                             (TIMESTAMPDIFF(MINUTE, adddate(fechasal, horasal), adddate(fechalleg, horalleg))) duracion
  13.                         FROM VIAJE_ASIGNADO) viajes
  14.                     HAVING duracion = MAX(duracion));

Para mi es un ejercicio algo complicado para iniciarse...

Luego vemos el resto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 31/01/2015 a las 16:21
  #9 (permalink)  
Antiguo 31/01/2015, 15:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Posdata: Muevo el post al foro de MySQL para tratar el tema mas específicamente con sintaxis propia de ese DBMS.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 31/01/2015, 16:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Cita:
2.DNI y nombre de los conductores que hayan llevado todos los camiones de la empresa y número de rutas realizados por él con la empresa.
Hay al menos dos partes: a) Las camiones usados, y si los conductores usaron todos los camiones y b) las rutas realizadas por los conductores.
La primera parte hay muchas formas de hacerlo, pero podríamos usar una sencilla:
Código MySQL:
Ver original
  1. SELECT VP.dni, COUNT(DISTINCT VA.patente) usados
  2. FROM viaje_asignado VA
  3. HAVING usados = (SELECT COUNT(1) FROM vehiculos V);

La segunda es un poco más enredada, pero se puede pensar así:
Código MySQL:
Ver original
  1. SELECT CO.dni DocConductor, CO.nombre NombreConductor, GROUP_CONCAT(VP.ruta_id) rutasRealziadas
  2. FROM viaje_asignado VA
  3.     INNER JOIN viaje_programado VP ON VA.viaje_id = VP.viaje_id
  4.     INNER JOIN ruta R ON VP.ruta_id = R.ruta_id
  5.     INNER JOIN conductor CO ON VA.dni = CO.dni

Para combinarlo todo, podemos usar la primera como tabla derivada en el from:
Código MySQL:
Ver original
  1. INNER JOIN (SELECT VP.dni, COUNT(DISTINCT VA.patente) usados
  2.                 FROM viaje_asignado VA
  3.                 HAVING usados = (SELECT COUNT(1) FROM vehiculos V)) CV
  4.             ON CV.dni = CO.dni
Podría quedar entonces:
Código MySQL:
Ver original
  1. SELECT CO.dni DocConductor, CO.nombre NombreConductor, GROUP_CONCAT(VP.ruta_id) rutasRealziadas
  2. FROM viaje_asignado VA
  3.     INNER JOIN viaje_programado VP ON VA.viaje_id = VP.viaje_id
  4.     INNER JOIN ruta R ON VP.ruta_id = R.ruta_id
  5.     INNER JOIN conductor CO ON VA.dni = CO.dni
  6.     INNER JOIN (SELECT VP.dni, COUNT(DISTINCT VA.patente) usados
  7.                 FROM viaje_asignado VA
  8.                 HAVING usados = (SELECT COUNT(1) FROM vehiculos V)) CV
  9.             ON CV.dni = CO.dni;

Todo lo que te muestro es algo que aun hay que probar. Algunas restricciones en las consultas pueden funcionar bien en ciertas versiones de MySQL y no en otras.

¿Necesitas que siga, o ya se va entendiendo cómo se razona una consulta?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 31/01/2015 a las 19:35
  #11 (permalink)  
Antiguo 31/01/2015, 18:39
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Muchas gracias, me es de mucha ayuda.
La verdad es que lo veo muy complejo, seguire tus reconmedaciones y fragmentaré los ejercicios para una mas facil resolucion.
Le agradezco mucho su ayuda.
  #12 (permalink)  
Antiguo 03/02/2015, 07:26
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Hola, disculpe las molestias
Tengo una duda, verá he construido dos funciones en SQL :

Código MySQL:
Ver original
  1. drop function if exists esMatricula;
  2.  
  3. delimiter //
  4. create function esMatricula(cad char(7)) returns int
  5.     declare k int default length(cad);
  6.     declare i int default 1;
  7.     declare j int default 5;
  8.     while(i<=4) do
  9.         if (ascii(substring(cad,i,1))>=48 and ascii(substring(cad,i,1))<=57) then
  10.             set i=i+1;
  11.         else
  12.             return 0;
  13.         end if;
  14.     end while;
  15.     while(j<=7) do
  16.         if ((ascii(substring(cad,j,1))>=65 and ascii(substring(cad,j,1))<=90 then
  17.             set j=j+1;
  18.         else
  19.             return 0;
  20.         end if;
  21.     end while;
  22.     return 1;
  23. //
  24. delimiter ;
[/CODE]

Y:

Código MySQL:
Ver original
  1.  
  2. delimiter //
  3. create function esFecha(cad varchar(10)) returns int
  4.     declare aux int default 0;
  5.     if (isDATE(cad))=1 then
  6.         aux=1;
  7.     end if;
  8.     return aux;
  9. //
  10. delimiter ;
[/CODE]

La primera sirve para comprobar siuna cadena de caracteres de longitud 8 está compuesta por 4 digitos (las 4 primeras posiciones) y 3 digitos(las 3 ultimas posiciones)

Y "esFecha" sirve para comprobar si una cadena de caractres de 10 elementos, corresponde a una fecha : YYYY/MM/DD

Ambas me dan error, pero no logro saber porqué.
Agradeceria algun tipo de ayuda

Última edición por gnzsoloyo; 03/02/2015 a las 08:54
  #13 (permalink)  
Antiguo 03/02/2015, 07:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

El primer consejo que se te peude dar, es que no hagas en la base cosas que en lenguajes de programación, y muy especialmente en la misma pagina web puedes hacer mejor...
Todo lo que estás poniendo es para hacer en Javascript, o en el lenguaje de programación que estás usando.
Mandar a la base a ejecutar funciones almacenadas, si no son usadas expresamente por una consulta, o bien un stored procedure es ineficiente, impráctico y falto de optimización, además de generar aumento de costos a la base.

Por otro lado, sería bueno que nos digas qué error te muestra, ya que pueden ser varios ( ami se me ocurren al menos dos).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 03/02/2015, 08:06
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Se que sería mejor usando otros programas, pero debemos hacerlo desde SQL...

El error que me da la primera función es:

ERROR 1064(42000): you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'then
set j=j+1;
else
return 0;
end if;
end while;
return 1;
end' at line 14

Y la segunda funcion:

ERROR 1064(42000):you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1;
end if;
return aux;
end' at line 5

Vaya, mismo error, pero diferente linea. Un error de sintaxis, pero no logro ver el problema.

Muchisimas gracias de nuevo, por la ayuda y por la rapidez de respuesta.

Tambien añadir, que estas funciones sirven para un procediemiento "PROCEDURE" para instertardatos a las tablas, que tengo realizado

Última edición por lulier19; 03/02/2015 a las 08:47
  #15 (permalink)  
Antiguo 03/02/2015, 09:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Bueno, empecemos con el segundo caso que es más sencillo: la función ISDATE() no existe en MySQL.
Y tampoco se necesita, puedes usar tranquilamente STR_TO_DATE() aprovechando que devuelve NULL cuando se produce un error de ese tipo...
Además, la asignación de un valor a una variable en MySQL obligatoriamente requiere de SET.
Código MySQL:
Ver original
  1.      
  2. delimiter $$
  3. create function esFecha(cad varchar(10)) returns int
  4.   declare aux int default 0;
  5.   if STR_TO_DATE(cad, '%d/%m/%Y') IS NOT NULL  then
  6.     SET aux=1;
  7.   end if;
  8. return aux;
  9. end$$
  10.  
  11. delimiter ;

El primer caso es algo más complejo...
Lo miro mas tranquilo, pero creo que es posible usar uno de los ejemplos de funcioens que está en la FAQ de este foro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 03/02/2015, 09:31
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Vaya, es extraño, mi mysql me detecta "ISDATE" como funcion
De todos modos, muchas gracias por este modo de realizarlo, ahora tengo una duda
Si quisiera crear una funcion para ver si una cadena de 8 elementos es una hora, ¿Seria asi?

Código MySQL:
Ver original
  1.  
  2. delimiter //
  3.   declare aux int default 0;
  4.   if STR_TO_DATE(cad, '%H/%M/%S') IS NOT NULL  then
  5.     SET aux=1;
  6.   end if;
  7. return aux;
  8. //
  9. delimiter ;

La funcion "esMatricula" creo que el error reside al incluir dos bucles "while" para recorrer la cadena de la posicion 1 a la 4 y otro bucle para recorrerla de la posicion 5 a la 7.

Pero no se otra forma de analizar la cadena en dos partes.

Tengo otra funcion creada para ver si una cadena de 8 caracteres esta formada unicamente por digitos:

Código MySQL:
Ver original
  1.  
  2. delimiter //
  3.     declare k int default length(cad);
  4.     declare i int default 1;
  5.     while(i<=k) do
  6.         if (ascii(substring(cad,i,1))>=48 and ascii(substring(cad,i,1))<=57) then
  7.             set i=i+1;
  8.         else
  9.             return 0;
  10.         end if;
  11.     end while;
  12.     return 1;
  13. //
  14. delimiter ;

Y he de decir, que funciona perfectamente sin ningun tipo de error.
Por eso pense que seria un buen metodo hacer lo mismo, pero fragmentandolo en dos mitades.
Pero nose si está expresado de manera correcta, o si contiene algún error de sintaxis como el "SET" de la funcion de la fecha.
  #17 (permalink)  
Antiguo 03/02/2015, 09:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Por favor, usa los highlights. Hay uno específico para MySQL...

Cita:
Vaya, es extraño, mi mysql me detecta "ISDATE" como funcion
SI miras en el manual de referencia (http://dev.mysql.com/doc/refman/5.6/...functions.html), verás que esa función no existe.

En cuanto al método que te mencionaba, hay cosas mas simples que podías buscar en las FAQs (http://www.forosdelweb.com/f86/faqs-...1/#post3093671)
Sobre la base de lo que está en ese post, se peued hacer:
Código MySQL:
Ver original
  1.   DECLARE TOTAL CHAR(100) DEFAULT '';
  2.   DECLARE VALOR INT DEFAULT 0;
  3.  
  4.     IF INSTR('0123456789', SUBSTRING(VAR, POS, 1))>0 THEN
  5.       SET TOTAL = TOTAL+1;
  6.     END IF;
  7.     SET POS = POS + 1;
  8.   UNTIL POS > 4 END REPEAT;

¿Lo quieres intentar de ese modo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 03/02/2015, 09:48
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Siento lo de los highlights y el trabajo que te he dado editando, no sabia de su existencia y estaba usando "[CODE]"
A partir de ahora lo usaré, que he dado a editar mi mensaje y he podido observar como se utilizan.
Ahora intentaré hacerlo de la forma que comentas, muchas gracias
  #19 (permalink)  
Antiguo 03/02/2015, 10:12
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Creo que esto funcionaria, ahora mi duda es como puedo comprobar si esta funcion es correcta
Código MySQL:
Ver original
  1. drop function if exists esMatricula;
  2.  
  3. delimiter //
  4. create function esMatricula(cad char(7)) returns int
  5.     DECLARE POS INT DEFAULT 1;
  6.     DECLARE TOTAL CHAR(7) DEFAULT '';
  7.     DECLARE VALOR INT DEFAULT 0;
  8.     DECLARE AUX INT DEFAULT 0; 
  9.  
  10.     REPEAT
  11.         IF (ascii(substring(cad,POS,1))>=48 and ascii(substring(cad,POS,1))<=57) THEN
  12.             SET TOTAL = TOTAL+1;
  13.         END IF;
  14.         SET POS = POS + 1;
  15.     UNTIL POS > 4 END REPEAT;
  16.     REPEAT
  17.         IF (ascii(substring(cad,POS,1))>=65 and ascii(substring(cad,POS,1))<=90) THEN
  18.             SET TOTAL = TOTAL+1;
  19.         END IF;
  20.         SET POS = POS + 1;
  21.     UNTIL POS > 7 END REPEAT;
  22.     if TOTAL=7 then
  23.         set aux=1;
  24.     END IF;
  25.     RETURN AUX;
  26. //
  27. delimiter ;

Última edición por lulier19; 03/02/2015 a las 10:18
  #20 (permalink)  
Antiguo 03/02/2015, 10:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

Pues usándola...
Código MySQL:
Ver original
  1. SELECT esMatricula('1234M678');
Y ver qué te devuelve.

Es lo que se llama simplemente "probar"...

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #21 (permalink)  
Antiguo 03/02/2015, 10:34
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Pues no entiendo porqué, pero siempre me devuelve el valor 0 (FALSO) y nunca 1 (VERDADERO) :(

EDITO: Ya se porqué, solo detecta si uso mayusculas, ahora mirare para que detecte tambien minusuculas.
Muchisimas gracias por todo
  #22 (permalink)  
Antiguo 03/02/2015, 10:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

La verdad es que si la meta es esta:
Cita:
La primera sirve para comprobar siuna cadena de caracteres de longitud 8 está compuesta por 4 digitos (las 4 primeras posiciones) y 3 digitos(las 3 ultimas posiciones)
Estás haceindolo muy complciado. Ni siquiera tiene sentido usar ASCII().
Con esto devolvería cero (FALSE) si no cumple, o 1 (TRUE), si cumple con el esquema "9999A999", donde "9" es un digito del 0 al 9, y "A" es una lera cualquiera del abecedario.
Código MySQL:
Ver original
  1. DROP FUNCTION IF EXISTS esMatricula;
  2.  
  3. DELIMITER $$
  4. CREATE FUNCTION esMatricula(cad VARCHAR(8)) returns INT
  5.     DECLARE POS INT DEFAULT 1;
  6.     DECLARE vcad VARCHAR(8);
  7.     SET vcad = UPPER(cad);
  8.     IF INSTR('ABCDEFCGHIJKLMNOPQRSTUVWXYZ', substring(vcad, 5, 1)) = 0 THEN
  9.         RETURN 0;
  10.     END IF;
  11.     SET POS = 1;
  12.     REPEAT
  13.         IF INSTR('1234567890', substring(vcad, POS, 1)) = 0 THEN
  14.             RETURN 0;
  15.         END IF;
  16.         SET POS = POS + 1;
  17.     UNTIL POS > 4 END REPEAT;
  18.     SET POS = 6;
  19.     REPEAT
  20.         IF INSTR('1234567890', substring(vcad, POS, 1)) = 0 THEN
  21.             RETURN 0;
  22.         END IF;
  23.         SET POS = POS + 1;
  24.     UNTIL POS > 8 END REPEAT;
  25.     RETURN 1;
  26. END$$
  27. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #23 (permalink)  
Antiguo 03/02/2015, 11:34
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

La verdad es que usando esa funcion es mucho mas sencillo.
Lo tengo acabado y funcional, pero con la funcion ASCII, pero viendolo de ese modo, lo facilita muchisimo
Muchas gracias, tengo un pequeño problema con la carga de datos en la tabla:

Código MySQL:
Ver original
  1. drop database if exists transporte;
  2.  
  3. create database transporte;
  4.  
  5. use transporte;
  6.  
  7.  
  8. ##CREACION DE TABLAS
  9.  
  10. CREATE TABLE PROVINCIAS(
  11. CodProvincia CHAR(3) PRIMARY KEY,
  12. Provincia VARCHAR(20)
  13. );
  14.  
  15. CREATE TABLE CONDUCTOR(
  16. Nombre VARCHAR(50),
  17. direccion VARCHAR(40),
  18. Provincia VARCHAR(20) REFERENCES PROVINCIAS(Provincia)
  19. );
  20.  
  21. CREATE TABLE VEHICULO(
  22. Matricula CHAR(7) PRIMARY KEY,
  23. CargaMax VARCHAR(50),
  24. FechaCompra DATE
  25. );
  26.  
  27. CiudadSalida VARCHAR(35) NOT NULL,
  28. CiudadLlegada VARCHAR(35) NOT NULL,
  29. KM INT
  30. );
  31.  
  32.  
  33. CREATE TABLE VIAJE_PROGRAMADO(
  34. Viaje CHAR(4),
  35. Ruta CHAR(4),
  36. Fecha_Salida DATE,
  37. Hora_Salida TIME,
  38. Fecha_Llegada DATE,
  39. Hora_Llegada TIME,
  40. PRIMARY KEY (Viaje, Ruta),
  41. FOREIGN KEY (Ruta) REFERENCES RUTA (Ruta)
  42. );
  43.  
  44.  
  45. CREATE TABLE VIAJE_ASIGNADO(
  46. Viaje CHAR(4) PRIMARY KEY,
  47. DNI CHAR(8) REFERENCES CONDUCTOR(DNI),
  48. Matricula CHAR(7) REFERENCES VEHICULO(Matricula),
  49. FOREIGN KEY (Viaje) REFERENCES VIAJE_PROGRAMADO(Viaje)
  50. );
  51.  
  52.  
  53. ##CARGA DE DATOS
  54.  
  55. LOAD DATA LOCAL INFILE './provincias.txt' INTO TABLE PROVINCIAS  LINES TERMINATED BY '\r\n';
  56. LOAD DATA LOCAL INFILE './conductor.txt' INTO TABLE CONDUCTOR  LINES TERMINATED BY '\r\n';
  57. LOAD DATA LOCAL INFILE './vehiculo.txt' INTO TABLE VEHICULO  LINES TERMINATED BY '\r\n';
  58. LOAD DATA LOCAL INFILE './ruta.txt' INTO TABLE RUTA  LINES TERMINATED BY '\r\n';
  59. LOAD DATA LOCAL INFILE './viaje.txt' INTO TABLE VIAJE_PROGRAMADO LINES TERMINATED BY '\r\n';
  60. LOAD DATA LOCAL INFILE './prog_viaje.txt' INTO TABLE VIAJE_ASIGNADO  LINES TERMINATED BY '\r\n';


Como puedes comprobar, creo unas determinadas tablas e inserto datos, pues bien:

1.-El primer numero del primer DNI se almacena en la tabla como "?", es decir, escribo en el txt
"11111111 Juan Lopez Real 72 Barcelona" (Separando cada dato con tabulador)
Y cuando veo lo que se ha ingresado en la tabla, en lugar de "11111111" lo que hay es "?1111111"
Solo sucede para el primer DNI, el resto de datos introducidos en la tabla se incluyen de manera normal.
2.-Me sucede lo mismo con la primera matricula, su primer digito se sustituye por "?"
3.-No entiendo porqué, no se cargan los datos a "VIAJE_PROGRAMADO" ni a "VIAJE_ASIGNADO"

He comprobado que "RUTA" al ser FOREIGN KEY, que la ruta que incluyo en "VIAJE_PROGRAMADO" esté en la tabla "RUTA" y lo mismo con "viaje", "dni" y "matricula" en las otras tablas, pero sigue sin añadirme los datos

Estoy algo frustrado, porque no se incluyen esos datos en las tablas

Última edición por lulier19; 03/02/2015 a las 11:41
  #24 (permalink)  
Antiguo 03/02/2015, 15:33
 
Fecha de Ingreso: enero-2015
Mensajes: 13
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Crear consultas para base de datos Mysql

Nada, todo arreglado.
Era un problema con mis .txt que he conseguido solucionar
Pues bueno, ya no molesto mas.
Darte muchisimo las gracias por tu ayuda y dedicacion, no tenias porque prestarme ayuda con mis dudas, pero lo has hecho desde el primer momento, y me has ayudado muchisimo.
Una vez mas, gracias por todo
  #25 (permalink)  
Antiguo 03/02/2015, 16:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Crear consultas para base de datos Mysql

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: bases-de-datos-general, tabla
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 07:31.