听起来您这里的数据库设计很差。您有一个学生,对于每个学生,您都想知道他们的表格。您似乎可以访问他们加入的年份,因此您可以存储“表格 1”年份。
为了精确起见,假设表格年份从 4 月 1 日开始。
数据库表看起来像
students (
-- added an int primary key for use later
id INT PRIMARY,
-- update this as needed
student_id VARCHAR(20) UNIQUE ,
yearStartedForm1 INT UNSIGNED
)
使用您的示例,您可能有以下记录
id student_id yearStartedForm1
1 2013-04-04888 2013
2 2013-04-01920 2012
从这个“表格 1”年份,您可以使用类似以下两个的方法计算他们当前的年份。首先,如果您想将 form>4 替换为“已完成”
SELECT
d.id,
d.student_id,
IF(d.form > 4,'completed',d.form) AS form,
d.yearStartedForm1
FROM (
SELECT
s.id,
s.student_id,
v.currentFormYear - s.yearStartedForm1 + 1 AS form,
s.yearStartedForm1
FROM students s,(
SELECT IF(MONTH(CURRENT_DATE)<4,YEAR(CURRENT_DATE)-1,YEAR(CURRENT_DATE)) AS currentFormYear
) v
) d
其次,如果您想将形式限制为最大 5
SELECT
s.id,
s.student_id,
LEAST(v.currentFormYear - s.yearStartedForm1 + 1,5) AS form,
s.yearStartedForm1
FROM students s,(
SELECT IF(MONTH(CURRENT_DATE)<4,YEAR(CURRENT_DATE)-1,YEAR(CURRENT_DATE)) AS currentFormYear
) v
这将动态地为您提供当前的表单编号,而无需重复的行。当然,您可以轻松地将 yearStartedForm1 更改为 DATE 字段,并使用 DATEDIFF 或类似功能。这个想法仍然是相同的,因为目前您正在复制每个学生行,而实际上您所要做的只是根据经过的时间得出一个表格编号。