Просто чтобы расширить ответ Гордона Линоффа (который должен быть принят как правильный), преимущество наличия каждой даты в качестве отдельной строки (а не в качестве нового столбца) состоит в том, что это облегчает запрос к таблице.(У этого есть много других преимуществ помимо этого, но для ваших целей давайте начнем с упрощения запросов).Таким образом, следуя его предложенной схеме, ваша таблица может иметь данные, которые выглядят следующим образом:
| 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 |
Попытка сделать что-либо из этого с таблицей, имеющей сотни столбцов для каждой даты, будеттрудно, если не невозможно.