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

Consulta que haga....

Estas en el tema de Consulta que haga.... en el foro de Bases de Datos General en Foros del Web. Buenas, estoy aquí como loco dándole vueltas pero no consigo hacer una consultas que realice lo siguiente: mostrar los identificadores de los monitores que están ...
  #1 (permalink)  
Antiguo 12/12/2012, 12:57
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Consulta que haga....

Buenas, estoy aquí como loco dándole vueltas pero no consigo hacer una consultas que realice lo siguiente:
mostrar los identificadores de los monitores que están disponibles para dar clases a un grupo nuevo , es decir, que tenga libre los días y las horas a las que se imparte el grupo.
Las tablas son las siguientes:
Empleado(id, nom, apells)
Grupo(id, monitor (clave foranea de empleado), dias, hora_inicio, hora_fin)

Si alguien sabe hacerla se lo agradeceria.

Un saludo y gracias!
  #2 (permalink)  
Antiguo 13/12/2012, 02:33
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Consulta que haga....

¿Qué tienes hasta ahora?
  #3 (permalink)  
Antiguo 13/12/2012, 11:12
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

Pues intente obtener las instancias haciendo:
Código SQL:
Ver original
  1. SELECT *
  2. FROM empleado
  3. WHERE NOT EXISTS (SELECT monitor
  4.       FROM grupo  
  5.       WHERE '$dias' LIKE dias  
  6.       AND (('$inicio' BETWEEN inicio AND fin) OR ('$fin' BETWEEN inicio AND fin)))
pero no me muestra ninguna y de ningun otra forma se hacerla. ¿Podrias ayudarme?
Gracias

Última edición por gnzsoloyo; 13/12/2012 a las 11:16 Razón: Código SQL sin etiquetar.
  #4 (permalink)  
Antiguo 13/12/2012, 11: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, 5 meses
Puntos: 2658
Respuesta: Consulta que haga....

Empezando por el principio: ¿Qué DBMS? ¿Oracle?, ¿SQL Server?, ¿MySQL?, ¿Postgre SQL?
La sintaxis en algunos casos puede variar de acuerdo a cuál sea.
Por otro lado, "dias", ¿qué tipo de columna es? ¿DATE, TIMESTAMP, DATETIME?
¿Qué contiene esa variable "$dia"?
__________________
¿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 13/12/2012, 12:31
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

Si te refieres al gestor de base de datos he usado PHPMyadmin.
En cuestion a 'dias' es una variable de tipo un set o vector.
  #6 (permalink)  
Antiguo 13/12/2012, 12: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, 5 meses
Puntos: 2658
Respuesta: Consulta que haga....

phpMyadmin no es un Gestor de Base de Datos. Es un front-end que permite acceder al gestor de base de datos, que en tu caso es MySQL.
En cuanto a "dias", me refiero a la variable, no a la columna de la tabla, aunque en tu caso, esa variable, para obtener el resultado, debería ser o un numero entero o el valor de la clave del campo SET.
¿Cuál de las dos cosas es?
Por otro lado, si "inicio" y "fin" son DATE o DATETIME, como se infiere, supongo que habrás manejado las fechas en su formato "AAAA-MM-DD", ¿no es así?

Sería mejor que postearas una captura de la consulta tal y como queda creada, con valores reales producto de tu aplicación, para asegurarnos que lo que las variables ponen sea realmente correcto.
¿Puedes hacer eso?
__________________
¿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 13/12/2012, 13:01
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

Perdón por la confusión de conceptos, hay algunos que no los tengo claros aún.
Con respecto a 'dias' es el valor de la clave del campo SET.
Por otro lado, 'inicio' y 'fin' son de tipo time.
Te adjunto aquí un par de imágenes:
  #8 (permalink)  
Antiguo 13/12/2012, 13:08
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

¿como puedo adjuntarte las imágenes? no me deja solo un enlace (http) ?
  #9 (permalink)  
Antiguo 13/12/2012, 13:43
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, 5 meses
Puntos: 2658
Respuesta: Consulta que haga....

Vamos a ver un par de detalles:
Por un lado, un campo SET es un campo que puede tomar uno de N valores de clave, de acuerdo a una lista de claves definida en la tabla. En ese sentido LIKE no es aplicable, porque una clave no puede ser "parecida a", es igual o no lo es.
Además, el uso de LIKE en la forma que lo haces, sin comodines, es semánticamente equivalente a "=". Pero como LIKE aplica a cadenas de texto, el algoritmo que usa es diferente (internamente), por lo que no es una buena idea utilizar esa cláusula. El "=" es lo que corresponde.
También sucede que la lógica del SQL espera que el primer parámetro de una ecuación lógica en el WHERE sea un campo de las tablas, y no un parámetro de entrada o una constante. Así que en realidad estás escribiendo mal la sentencia.
A esto hay que sumarle que si "inicio" y "fin" son TIME, como dices, debes enviarla como "HH:MM:SS", porque eso es lo que MySQL espera, y además las horas deben ser forzosamente de 00:00:00 a 23:59:59, porque es el formato de un TIME. Si estás tomando las horas en 12/12 (AM/PM), eso no sirve.
También debes tener cuidado con los rangos del BETWEEN. Todos los DBMS (no sólo MySQL) esperan recibir los parámetros como mayor/menor, por lo que si inicio está expresada en AM/PM y las horas representan 06:00:00 PM 03:00:00 AM, el rango buscado nunca dará bien.


Por lo que me describes, la consulta debería ser más o menos así, suponiendo que el parámetro de la variable "dias" fuese una cadena de texto al estilo "Jueves" o algo así:

Código MySQL:
Ver original
  1. FROM empleado
  2.       FROM grupo  
  3.       WHERE dias = '$dias'
  4.       AND (('$inicio' BETWEEN inicio AND fin) OR ('$fin' BETWEEN inicio AND fin)))

Respecto a las imágenes o los links, todavía no has cumplido los 30/30 (30 días en FDW y 30 mensajes), por lo que aún no puedes poner ninguno de ambos.
__________________
¿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 14/12/2012, 05:09
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

Buenas, ante todo gracias por la ayuda.
Pero la verdad que esa consulta no me realiza lo que deseo, ya que tengo un monitor con id 20 que no imparte ningun grupo y por ejemplo realizo la siguiente consulta:
Código MySQL:
Ver original
  1. FROM empleado
  2.       FROM grupo  
  3.       WHERE dias = 'Lunes,Miercoles'
  4.       AND (('12:00:00' BETWEEN inicio AND fin) OR ('12:30:00' BETWEEN inicio AND fin)))
y no me devuelve ninguna instancia, y yo quiero que me muestre ese monitor con id 20 que no da clases esos días a esas hora.
Yo puse la clausula NOT EXISTS creyendo que me valdría pero quizás haya otra sentencia que me valga.
Espero vuestra ayuda.
Un saludo.

Última edición por gnzsoloyo; 14/12/2012 a las 06:17 Razón: Código SQL sin etiquetar.
  #11 (permalink)  
Antiguo 14/12/2012, 06: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, 5 meses
Puntos: 2658
Respuesta: Consulta que haga....

NOT EXISTS se usa para relacionar algo en la tabla de la consulta base respecto de algo en la subconsulta, y eso no lo estás haciendo. Esencialmente son consultas independientes.
Lo que hay que hacer es hacer un LEFT JOIN que te devuelva todo lo de la primera tabla que no esté vinculado a la segunda, por ejemplo.
Supongamos que en la tabla GRUPO hay un campo que vincule al grupo con el empelado monitor, por medio de la PK de empelado, y que la FK en la tabla grupo se llame monitor.
La consulta para que te devuelva lo que buscas sería mas o menos:
Código MySQL:
Ver original
  1. SELECT E.*
  2. FROM empleado E LEFT JOIN grupo G ON E.empleado_id = G.monitor
  3.           (E.emplado_id = 20
  4.           AND G.dias IN('Lunes', 'Miercoles')
  5.           AND (TIME('12:00:00') BETWEEN G.inicio AND G.fin)
  6.                  OR
  7.                  (TIME('12:30:00') BETWEEN G.inicio AND G.fin)))
  8.           OR
  9.           (E.emplado_id = 20
  10.           AND G.dias IS NULL);

Probemos con esto y veamos.

La idea es que devuelva ese empleado, si es monitor de un grupo en un horario determinado, o bien si no tiene grupos asignados.

Lo que noto es que estás poniendo valores múltiples en la búsqueda para el campo "dias", y eso es incorrecto en cualquier caso: Si el SET tiene definidas claves multivalor, es un error gravísimo de diseño, y si no las tiene, jamás encontrará dos claves al mismo tiempo, porque el campo sólo puede tener asignado el valor de una sola a la vez.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 14/12/2012, 12:29
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

Buenas,
hice tu consulta pero me da fallo.
Lo primero, he estado haciendo pruebas con 'dias' y me lo reconoce como una cadena de caracteres ya no se porque pero si por ejemplo pongo que sea igual a 'Lunes' no me devolveria la instancia que tiene como dias 'Lunes,Miercoles' .
He realizado otra prueba: SELECT *
FROM grupo WHERE dias IN ('Lunes', 'Miercoles')
y esta consulta no me devuelve nada, teniendo que devolverme un par de grupos que se dan esos dias. Ahora me pone en duda de como tengo que tratar los SET's para trabajar correctamente con ellos en las consultas.
Con respeto a la idea de la consulta es que devuelva los monitores que NO dan clase a esa hora los dias indicados.
Saludos y muchas gracias por su ayuda.
  #13 (permalink)  
Antiguo 14/12/2012, 12:40
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, 5 meses
Puntos: 2658
Respuesta: Consulta que haga....

Cita:
Con respeto a la idea de la consulta es que devuelva los monitores que NO dan clase a esa hora los dias indicados.
Por eso la consulta busca los IS NULL.
Date una vuelta por el manual y lee lo que hace un LEFT JOIN (es un tema que hemos tratado muchísimas veces en el foro).
Cita:
Lo primero, he estado haciendo pruebas con 'dias' y me lo reconoce como una cadena de caracteres ya no se porque pero si por ejemplo pongo que sea igual a 'Lunes' no me devolveria la instancia que tiene como dias 'Lunes,Miercoles' .
Bueno eso es por o mismo que te he dicho:
Cita:
Lo que noto es que estás poniendo valores múltiples en la búsqueda para el campo "dias", y eso es incorrecto en cualquier caso: Si el SET tiene definidas claves multivalor, es un error gravísimo de diseño, y si no las tiene, jamás encontrará dos claves al mismo tiempo, porque el campo sólo puede tener asignado el valor de una sola a la vez.
Cuando tienes un Curso o Grupo de trabajo cuya asistencia se realiza en uno o más días, el diseño de la base es completamente diferente, pero jamás (y esto es una regla absoluta de las bases de datos relacionales), jamás se usan campos multivaluados. Sólo sirven para dar dolores de cabeza en las consultas y generan serias complicaciones de consistencia.
Vamos a ver si se entiende:
- El grupo de tareas se reune o asiste uno o más días. Eso implica que existe un diseño de horarios.
- Los Horarios componen una entidad separada, tienen una relación con el grupo de 1:N, y en ellos es donde se asientan: día de asistencia, horario, id del grupo.
- El grupo no tiene FK de horario. No lo precisa, porque un grupo no depende de un horario, sino que el horario está asignado al grupo. El horario y su validación se obtienen de un INNER JOIN.

¿se va entendiendo?
__________________
¿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 14/12/2012, 12:52
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

Creo que te voy entendiendo.
Por lo tanto creo una entidad nueva que sea horario la cual se relaciona con grupo a través de la clave foránea grupo y como PK que seria los 3 atributos no? o me equivoco¿
  #15 (permalink)  
Antiguo 14/12/2012, 13:03
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, 5 meses
Puntos: 2658
Respuesta: Consulta que haga....

Básicamente.
Por supuesto que estoy suponiendo mucho, porque como no conozco las reglas de negocio del sistema que trabajas es muy probable que me estén faltando detalles. Pero en lo esencial ese es el camino.
Uno de los elementos fundamentales del modelo E-R es que siempre que te encuentras que una única instancia de un objeto tiene un traributo que puede contener más de un valor del dominio (si es un numero, varios números al mismo tiempo, si es una calle, varias, etc), eso siempre indica que hay una relación 1:N entre los atributos básicos y ese, y toda relación 1:N requiere separar el atributo en una entidad que lo identifique.
Eso se llama "atomicidad del dominio de un atributo", es decir que cada atributo sólo puede contener un único valor, o ser nulo (en ciertos casos).
Sólo se suprime esa regla en ciertos caos que no se pueden generalizar como regla. En esas situaciones son decisiones de diseño, pero a la larga se paga costo de performance.
__________________
¿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 17/12/2012, 04:39
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Consulta que haga....

Ya he modificado mi ER, quedando de tal manera una entidad horario en la que tiene 4 atributos siendo los cuatros primary key (dias,hora_inicio,hora_fin,grupo) y la entidad grupo con primary key id_grupo y los atributos actividad, monitor,num_alumnos. Estas dos entidades realicionada con una relacion de 1:N.
Con respecto a las reglas que comentas, no se a que te refieres con eso.
Si te refieres a si un grupo se d distintos dias pero a la misma hora, reglas asi?
Habría alguna regla que modificaria el diseño que he realizado?
Un saludo y gracias!

Etiquetas: 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 17:49.