如何创建上课日期的行?

时间:2019-07-17 02:51:58

标签: mysql

我想生成一个表,用于在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表。

感谢您的帮助!

2 个答案:

答案 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