-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBD Mathez.sql
254 lines (208 loc) · 8.11 KB
/
BD Mathez.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
CREATE DATABASE Mathez
DEFAULT CHARACTER SET = 'utf8mb4';
USE Mathez;
CREATE TABLE Alumnos(
numCta INT NOT NULL PRIMARY KEY,
apellidoP VARCHAR(40) NOT NULL,
apellidoM VARCHAR(40) NOT NULL,
nombres VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL,
passwd VARCHAR(20) NOT NULL
)ENGINE=INNODB;
CREATE TABLE Cursos(
id_curso INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
)ENGINE=INNODB;
CREATE TABLE Temas(
id_tema INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
tema VARCHAR(100) NOT NULL,
id_curso INT NOT NULL,
FOREIGN KEY (id_curso) REFERENCES Cursos(id_curso) ON DELETE CASCADE
)ENGINE=INNODB;
CREATE TABLE Inscripciones(
id_inscrip INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
id_curso INT NOT NULL,
numCta INT NOT NULL,
fecha_inicio DATE NOT NULL,
progreso DECIMAL(4,1) NOT NULL, -- Para mostrar el avance en porcentaje
estatus ENUM("En progreso", "Terminado") NOT NULL,
fecha_termino DATE,
FOREIGN KEY (id_curso) REFERENCES Cursos(id_curso) ON DELETE CASCADE,
FOREIGN KEY (numCta) REFERENCES Alumnos(numCta) ON DELETE CASCADE
)ENGINE=INNODB;
-- Tabla para guardar el estado de los temas "terminado" si ya vio el tema, y "en progreso" y aun no lo ha visto
CREATE TABLE Avances(
id_avance INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
id_inscrip INT NOT NULL,
id_tema INT NOT NULL,
estatus ENUM("En progreso", "Terminado") NOT NULL,
FOREIGN KEY (id_inscrip) REFERENCES Inscripciones(id_inscrip) ON DELETE CASCADE,
FOREIGN KEY (id_tema) REFERENCES Temas(id_tema) ON DELETE CASCADE
)ENGINE=INNODB;
-- CONSULTAS SOBRE LAS TABLAS
-- Llenado de la tabla alumnos
INSERT INTO alumnos (numCta, apellidoP, apellidoM, nombres, email, passwd)
VALUES ('123456789', 'Gomez', 'Trejo', 'Ezequiel', 'correo123@gmail.com', '1234'),
('987654321', 'Artiaga', 'Martinez', 'Maria Fernanda', 'correo321@gmail.com', '4321');
-- Llenado de la tabla cursos
INSERT INTO cursos(nombre)
VALUES("Cálculo");
-- Llenado de la tabla temas
INSERT INTO temas(tema, id_curso)
VALUES("Conjuntos", 1), ("Tipos de Funciones", 1), ("Regla de Correspondencia", 1), ("Características de la Gráfica", 1),
("Variación a partir de un comportamiento de casos", 1), ("Polinomios", 1), ("Racionalización", 1), ("Razones Trigonométricas", 1),
("Variabilidad", 1), ("Sucesiones", 1);
-- Consulta para obtener el avance que lleva del curso un alumno
SELECT (SELECT COUNT(*) FROM avances
WHERE estatus = 'Terminado' AND id_inscrip = 2) * 100.0 / COUNT(*) AS Avance
FROM avances
WHERE id_inscrip = 2;
-- Consulta para obtener el estatus de los temas de un curso en especifico
SELECT cursos.nombre, temas.tema, avances.estatus
FROM cursos INNER JOIN temas
ON cursos.id_curso = temas.id_curso
INNER JOIN avances
ON temas.id_tema = avances.id_tema
INNER JOIN inscripciones
ON inscripciones.id_inscrip = avances.id_inscrip
WHERE cursos.id_curso = 2 AND inscripciones.numCta = 123456789
-- Consulta para obtener el progreso de un curso en el que esta inscrito un alumno
SELECT alumnos.apellidoP, alumnos.apellidoM, alumnos.nombres, cursos.nombre, inscripciones.progreso
FROM inscripciones INNER JOIN cursos
ON inscripciones.id_curso = cursos.id_curso
INNER JOIN alumnos ON inscripciones.numCta = alumnos.numCta
WHERE inscripciones.id_inscrip = 1 AND inscripciones.id_curso = 2 AND inscripciones.numCta = 123456789
-- DISPARADORES
-- Disparador para insertar la fecha de inicio, progreso y estatus en un curso
DROP TRIGGER IF EXISTS fecha_inicio_curso;
DELIMITER //
CREATE TRIGGER fecha_inicio_curso
BEFORE INSERT ON inscripciones
FOR EACH ROW
BEGIN
SET NEW.fecha_inicio = CONVERT_TZ(NOW(), '+00:00', '-06:00');
SET NEW.progreso = 0.0;
SET NEW.estatus = "En progreso";
END //
DELIMITER ;
-- Disparador para insertar "En progreso" en la columna Estatus de la tabla avances para todos los temas del curso en
-- el que esta incrito el alumno
DROP TRIGGER IF EXISTS estatus_avances_tema;
DELIMITER //
CREATE TRIGGER estatus_avances_tema
AFTER INSERT ON inscripciones
FOR EACH ROW
BEGIN
INSERT INTO avances (id_inscrip, id_tema, estatus)
SELECT NEW.id_inscrip, id_tema, 'En progreso'
FROM temas
WHERE temas.id_curso = NEW.id_curso;
END //
DELIMITER ;
-- Disparador para insertar el progreso del avance de un curso inscrito en la tabla inscripciones
DROP TRIGGER IF EXISTS progreso_curso;
DELIMITER //
CREATE TRIGGER progreso_curso
AFTER UPDATE ON avances
FOR EACH ROW
BEGIN
DECLARE Avance DECIMAL(5,2);
-- Calculamos el porcentaje de avance
SELECT COUNT(*) * 100.0 / (SELECT COUNT(*) FROM avances WHERE id_inscrip = NEW.id_inscrip)
INTO Avance
FROM avances
WHERE estatus = 'Terminado' AND id_inscrip = NEW.id_inscrip;
-- Actualizamos el campo progreso en inscripciones
UPDATE inscripciones
SET progreso = Avance
WHERE id_inscrip = NEW.id_inscrip;
IF Avance = 100 THEN
UPDATE inscripciones
SET estatus = 'Terminado',
fecha_termino = CONVERT_TZ(NOW(), '+00:00', '-06:00')
WHERE id_inscrip = NEW.id_inscrip;
ELSE
UPDATE inscripciones
SET estatus = 'En progreso',
fecha_termino = NULL
WHERE id_inscrip = NEW.id_inscrip;
END IF;
END //
DELIMITER ;
-- Disparador para insertar un nuevo avance en Avances al insertar un nuevo tema y actualizar progreso del curso
DROP TRIGGER IF EXISTS nuevo_tema_avance;
DELIMITER //
CREATE TRIGGER nuevo_tema_avance
AFTER INSERT ON temas
FOR EACH ROW
BEGIN
DECLARE Avance DECIMAL(5,2);
INSERT INTO avances (id_inscrip, id_tema, estatus)
SELECT DISTINCT inscripciones.id_inscrip, NEW.id_tema, 'En progreso'
FROM inscripciones INNER JOIN temas
ON inscripciones.id_curso = temas.id_curso
WHERE inscripciones.id_curso = NEW.id_curso;
-- Calcular el porcentaje de avance para cada inscripcion asociada al curso
UPDATE inscripciones
SET progreso = (
SELECT COUNT(*) * 100.0 / (SELECT COUNT(*) FROM avances WHERE id_inscrip = inscripciones.id_inscrip)
FROM avances
WHERE estatus = 'Terminado' AND id_inscrip = inscripciones.id_inscrip
)
WHERE id_curso = NEW.id_curso;
-- Actualizar estatus y fecha de termino basado en el progreso calculado
UPDATE inscripciones
SET
estatus = CASE
WHEN progreso = 100 THEN 'Terminado'
ELSE 'En progreso'
END,
fecha_termino = CASE
WHEN progreso = 100 THEN CONVERT_TZ(NOW(), '+00:00', '-06:00')
ELSE NULL
END
WHERE id_curso = NEW.id_curso;
END //
DELIMITER ;
-- Disparador para actualizar progreso del curso al momento de eliminar un tema
DROP TRIGGER IF EXISTS elimina_tema_avance;
DELIMITER //
CREATE TRIGGER elimina_tema_avance
AFTER DELETE ON temas
FOR EACH ROW
BEGIN
DECLARE Avance DECIMAL(5,2);
-- Actualizamos el progreso y el estatus de todas las inscripciones relacionadas con el curso del tema eliminado
UPDATE inscripciones
SET progreso = (
SELECT IFNULL(
(SELECT COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM avances WHERE id_inscrip = inscripciones.id_inscrip), 0)
FROM avances
WHERE estatus = 'Terminado'
AND id_inscrip = inscripciones.id_inscrip), 0)
),
estatus = (
CASE
WHEN (
SELECT COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM avances WHERE id_inscrip = inscripciones.id_inscrip), 0)
FROM avances
WHERE estatus = 'Terminado'
AND id_inscrip = inscripciones.id_inscrip
) = 100 THEN 'Terminado'
ELSE 'En progreso'
END
),
fecha_termino = (
CASE
WHEN (
SELECT COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM avances WHERE id_inscrip = inscripciones.id_inscrip), 0)
FROM avances
WHERE estatus = 'Terminado'
AND id_inscrip = inscripciones.id_inscrip
) = 100 THEN CONVERT_TZ(NOW(), '+00:00', '-06:00')
ELSE NULL
END
)
WHERE id_curso = OLD.id_curso;
END //
DELIMITER ;