我是网络编程的新手。我试着建立一个考勤标记系统。我想下面的方法就可以了。
表
| student_id | 2018_5_8 | 2018_5_9 |
|------------|----------|----------|
| | | |
我每天都要添加一列。如果学生的现值是1或者其他是0.这是一个好方法还是坏方法?为什么?有没有其他方法可以做到这一点?
答案 0 :(得分:3)
这是一种非常糟糕的方法。在SQL中,表具有固定的列集。建议不要每天添加新列。
您要做的是将数据放在不同的行中。我会推荐这样的东西:
create table attendance (
attendanceid int primary key, -- "autoincrement", "serial", or "identity" depending on the database
studentid int,
attendancedate date,
mark int
);
答案 1 :(得分:1)
为了扩展Gordon Linoff的答案(应该被接受为正确的答案),将每个日期作为自己的行(而不是新列)的好处是,这使得表更容易查询。 (除此之外还有许多其他好处,但为了您的目的,让我们从简化查询开始)。因此,按照他建议的架构,您的表可能包含如下数据:
| attendanceid | studentid | attendancedate | mark |
|--------------|-----------|----------------|------|
| 1 | 5 | 2018-05-08 | 1 |
| 2 | 3 | 2018-05-08 | 1 |
| 3 | 5 | 2018-05-09 | 0 |
| 4 | 3 | 2018-05-09 | 1 |
现在,您可以轻松地看到,在任何特定日期,特定学生是否被标记为现在。因此,如果您想快速查看学生5
的出勤记录,您可以使用:
SELECT * FROM attendance
WHERE studentid = 5
会返回类似的内容:
| attendanceid | studentid | attendancedate | mark |
|--------------|-----------|----------------|------|
| 1 | 5 | 2018-05-08 | 1 |
| 3 | 5 | 2018-05-09 | 0 |
如果您只想查看学生5错过的日期,可以使用:
SELECT * FROM attendance
WHERE studentid = 5 AND mark = 0
并获得:
| attendanceid | studentid | attendancedate | mark |
|--------------|-----------|----------------|------|
| 3 | 5 | 2018-05-09 | 0 |
或者,如果您想知道每个学生缺席的天数,您可以使用:
SELECT studentid, COUNT(*) AS missed_days FROM attendance
WHERE mark = 0
GROUP BY studentid
对于上面的示例数据,将返回:
| studentid | missed_days |
|-----------|-------------|
| 3 | 0 |
| 5 | 1 |
如果不是不可能的话,尝试使用每个日期有数百列的表来执行此操作将很困难。