Consuslta en SQL

Y no logro hacerla (además de otras mil cosas que no me salen :)):
Tabla1 Hijos :
Id2, Nombre, Apellidos
Tabla 2 Actividades:
Id2, Tramo, Actividad, Horas, Días
Cada niño puede estar apuntado a varias actividades.
Quiero saber que niños están a puntados a más de una y una de ellas sea "Taller de Inglés".
Y si tienes tiempo, pero si no ya me arreglaré, a la anterior añadirle que además de que una de ellas sea Taller de Inglés, que la otra le coincida en las mimas horas y días que otra u otras a las que esté apuntado.
La cuestión es que hay niños que se han apuntado a varias actividades que coinciden el mismo día y a la misma hora. De hecho estaría bien una consulta que me mostrara eso, niños con más de una actividad en el mismo día y hora también.
No necesito que sea en un formulario ni nada parecido, solo la instrucción SQL.
Un saludo, y gracias
PD Con la primera me arreglo que ya la modifico para otras cosas, las otras dos si tienes tiempo y no es complicado.

1 respuesta

Respuesta
1
Una cosa, estoy viendo que tienes un grave problema de diseño en tu base de datos.
Si el hijo puede estar en varias actividades, tienes que crear una nueva tabla que relaciones el 'id' del hijo con el 'id2' de la actividad. De no hacerlo así, un hijo sólo puede estar en una actividad o... sería otro 'id' de hijo.
Te preparo la consulta suponiendo que los que tengan el mismo nombre y apellidos son una misma persona.
SELECT hijos.id, hijos.nombre, hijos.apellidos
FROM hijos INNER JOIN Actividades ON hijos.id2 = Actividades.id2
WHERE (((Actividades.actividad)="Taller de Inglés") AND (([nombre] & " " & [apellidos]) In (select nombre & " " & apellidos from hijos group by nombre & " " & apellidos having count(*) > 1)));
De todas formas, insisto, deberías cambiar el modelo de la base de datos y separar la relación hijo-actividad.
Sobre lo de controlar que no se superpongan en el horario es bastante más complicado.
Para eso yo utilizaría mejor un procedimiento en Visual Basic para ir verificando los días y horas.
Hay un campo hijos.id que los asocia a un padre (puede estar repetido porque el padre tenga más de un hijo) y un hijos.Id2 que es único para cada uno pero puede estar repetido en la tabla actividades porque tienen más de una asociada.
Ya están creadas y los datos metidos, funcionando correctamente.
Y en código no me merece la pena porque es responsabilidad de ellos si se apuntan a más de una actividad, no lo limito a ese respecto. Pero a la hora de hacer grupos, si tengo que crear un nuevo grupo a otra hora, puedo cambiar a aquellos niños que tienen dos actividades a la misma hora, de ahí la consulta. Alguno se apuntan a varias por si no entran en alguna.
Así lo que me interesa es obtener por ejemplo:
Id2, nombre, apellidos, actividad, horas, días
34 Pepe Gotera Taller de Inglés 13.45 a 14.45 Martes y Jueves
34 Pepe Gotera Dibujo y Pintura 13.45 a 14.45 Martes y Jueves
Solo para aquellos que tienen Taller de Inglés y además otra actividad.
El esquema real de hijos es este:
Id (lo asocia con un padre)
id2 (lo define como único y lo asocia a sus actividades)
nombre_hijo
apellidos_hijo
fecha_nacimiento
Una pregunta sencilla: Si yo tengo 2 hijos y quiero apuntarlos a 2 actividades a cada uno... ¿cuántos registros tengo en la tabla Padres? ¿Y en Hijos? ¿Y en actividades?
Por lo que entiendo aparecería 4 veces en hijos, ¿o no?
Otra posibilidad es que 'id' sea la clave del padre en las dos tablas (padres e hijos=, id2 la clave identificativa del hijo en 'hijos' y 'actividades', y que la clave de la tabla de actividades fuera 'id2+actividad'.
En ese caso la consulta no sería la anterior sino esta:
SELECT hijos.id, hijos.nombre, hijos.apellidos
FROM hijos INNER JOIN Actividades ON hijos.id2 = Actividades.id2
WHERE (((Actividades.actividad)="Taller de Inglés") AND ((hijos.id2) In (select id2 from actividades group by id2 having count(*) > 1)));
En la tabla padres solo hay uno, con id se asocia a sus dos hijos, que también aparecen una sola vez y que con id2 quedan asociados a todas las actividades que cada uno quiera y no necesito id para las actividades porque no quedan vinculadas con otra tabla más que la de hijos, así todas las actividades con id2=20 se asocian al hijo que tenga ese id2 y que solo aparece una vez.
Y las actividades no se pueden repetir, no admiten duplicados.
Ya te digo que funciona bien la base. Con la respuesta que me has dado solo me lista los que tienen inglés y otra actividad, pero no me lista esa otra actividad, solo la de ingés.
Como lo que me interesa en realidad es ver quienes tienen dos actividades a la misma hora y día, cambié lo que me has puesto por:
SELECT hijos.Id2, hijos.nombre_hijo, hijos.apellidos_hijo, Actividades.actividad, Actividades.tramo, Actividades.horario, Actividades.dias
FROM hijos INNER JOIN Actividades ON hijos.id2 = Actividades.id2
WHERE (((Actividades.tramo)="Infantil y 1º de Primaria") AND ((Actividades.horario)="13:45 a 14:45") AND ((Actividades.dias)="Lunes y Miércoles") AND ((hijos.id2) In (select id2 from actividades group by id2 having count(*) > 1)));
Así, me salen todos los que tienen más de una actividad y me lista todas las que se hacen a ese día y a esa hora en infantil.
Pero me salen más de la cuenta pues ya no limito a los que tengan inglés.
Me he dado cuenta, de que la consulta en realidad debería de ser que tengan más de una actividad y que... O sea que es en la instrucción
In (select id2 from actividades group by id2 having count(*) > 1)
Donde debería insertar el resto de condiciones. Por lo que veo, es una consulta dentro de una consulta. Como el código debería de funcionarme para muchas más cosas se podría resumir en:
¿Cómo llamo a una consulta (ya creada) desde una consulta? Porque si hago una consulta que me liste aquellos Id2 (hijos) que hagan inglés, desde una segunda consulta al preguntar cuales tienen más de una actividad, me salen todos los que tengan inglés más otra, pero me lista todas, no solo inglés que es lo que sucede en el código que me enviaste.
Sería algo como
Selecciona los campos nombre, apellidos, actividad, horario, días
Si el hijo tiene más de una actividad
Y solo de los hijos que salen en la consulta "consulta de niños que hacen inglés"
Y prometo darlo por concluido, me estás ayudando mucho, más que nada porque aprendo y me "independizo". He visto que creas una consulta con el "in (select...)" pero no he encontrado por ahí código de ejemplo para hacer un "in (consulta_x)
Kike
Si creas una consulta en Access, después puedes usarla en otra consulta exactamente igual que si fuera una tabla.
En la ventana que te permite seleccionar las tablas de la consulta también te permite ver las consultas de selección que tengas.
Una cosilla, tengo que salir de viaje toda la semana que viene, así que estaré 'no disponible' unos cuantos días.
Espero que des con la solución. Sino, a la vuelta, seguimos.
Muchas gracias, este finde dejo la lista definitiva terminada. Pero después ya con más tiempo me dedicaré a dejarla en condiciones para cursos futuros y presidentes futuros. Seguro que alguna cosilla necesitaré si no la encuentro por ahí.
Tengo dos que hice hace años, con mucho curro y mucho código. Solo tengo que acordarme y dejar de liarme con javascript y php. Son muchos los que uso a la vez y mezclo propiedades y métodos de mala manera :)
Buen viaje y gracias de nuevo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas