我想生成一个表,用于在MySQL中保持学校上课率。 MySQL的使用联接,插入等方法可以简化此出勤表的创建的方法是什么?
我提供了一个代表以下时间表的表(请参阅表1)。时间表的每一行都包含有关班级,学生,星期几和上课时间的信息。目前有830行。
其他人通过创建日期的日历表来解决类似的问题,我将其表示为表2。
// Table 1: classSchedule <---- Starting table
scheduleID class studentID days startTime endTime
1 Biology A123456 MWF 10:30 12:00
2 Math A123456 MTWRF 09:30 10:30
3 English A123456 MW 13:00 14:30
...
// Table 2: schoolCalendar <---- Table of dates
calendarID date dayOfWeek dayNumber
...
11 2019-07-15 M 1
12 2019-07-16 T 2
13 2019-07-17 W 3
14 2019-07-18 R 4
15 2019-07-19 F 5
...
// Table 3: classAttendance <----- Desired table
attendanceID scheduleID date day attendanceCode
1 1 2019-07-15 M P
2 1 2019-07-17 W
3 1 2019-07-19 F
4 1 2019-07-22 M
5 1 2019-07-24 W
6 1 2019-07-26 F
...
我希望班表的上课时间安排与表3相似。每一行将在唯一的日期和时间上代表一个班级。它应该包含计划ID的列,以便在classSchedule表有更新时,我可以删除或更新classAttendance表。
感谢您的帮助!
答案 0 :(得分:0)
ATTENDANCE TABLE
attendanceID BIGINT UNSIGNED , -- you wound defenitely need that
scheduleID INT , -- schedule id
studentID INT -- student
date_attended -- simple date record
attendanceCode varchar(20) -- just a sample
涉及到一天。您可以使用MySQL date_format()函数来帮助您获得:
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
阅读此内容。
答案 1 :(得分:0)
这里是使用“ INSERT INTO SELECT”和“ INNER JOIN”的解决方案。关键方面是在INNER JOIN中使用IF语句,该语句检查该类是否在一周的给定日期发生。它使用以下形式的IF语句:
IF(条件,value_if_true,value_if_false)
IF(POSITION(SchoolCalendar.day in classScheduleTest.days)>0,SchoolCalendar.day,'')
此IF语句产生如下输出:
classScheduleTest.days SchoolCalendar.day Output
MTWRF M M
TR M
MWF W W
...
用于生成ClassAttendance表的MySQL语句如下:
INSERT INTO ClassAttendance
(ClassAttendance.classScheduleIndex,
ClassAttendance.className,
ClassAttendance.studentID,
ClassAttendance.classDate,
ClassAttendance.day)
SELECT classScheduleTest.classScheduleIndex,
classScheduleTest.className,
classScheduleTest.studentID,
SchoolCalendar.classDate,
SchoolCalendar.day
FROM classScheduleTest
INNER JOIN SchoolCalendar on IF(POSITION(SchoolCalendar.day in classScheduleTest.days)>0,SchoolCalendar.day,'') = SchoolCalendar.day
WHERE SchoolCalendar.classDate BETWEEN '2019-07-18' AND '2019-07-30'
我添加了一个WHERE条件,以将出勤记录限制为日期范围。结果输出的样本如下所示:
classAttendanceID classScheduleIndex className studentID classDate day
1117 2 Math A12345678 2019-07-18 R
1118 1 Biology A12345678 2019-07-19 F
1119 2 Math A12345678 2019-07-19 F
1120 1 Biology A12345678 2019-07-22 M
1121 2 Math A12345678 2019-07-22 M