我的目标是每年都能增加学生的成绩也就是明年中一变成中二。我尝试使用**mysql事件**,但似乎是复杂的我的情况。我有以下表格
id student_id form year
----------
1 2013-04-04888 1 2013
2 2013-04-01920 2 2013
一年后我想有这样的东西
id student_id form year
----------
1 2013-04-04888 1 2013
2 2013-04-01920 2 2013
3 2013-04-04888 2 2014
4 2013-04-01920 3 2014
有没有人有什么想法或建议,告诉我如何以专业的方式做到这一点
因为这是一个每年运行一次的进程,我会创建一个运行该查询的外部进程(在你的管理模块中再多一页,如果这是一个web应用程序,或者类似的东西取决于你在做什么);这样,用户可以准确地控制何时发生,而且实现起来非常简单。
可能是cron作业还是其他代理?
插入的内容应该是这样的:
INSERT INTO people(student_id,form,year)
SELECT student_id,max(form)+1,max(year)+1
FROM people
WHERE form < 10 -- or something
GROUP BY student_id
听起来您的数据库设计很差。你有一个学生,你想知道每个学生的年级。您似乎可以访问他们加入的年份,因此您可以存储"表单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"的年份中,你可以使用下面两个类似的东西来计算他们当前的年份。首先,如果你想用'completed'代替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或类似的函数。这个想法仍然是相同的,因为目前您正在复制每个学生行,而实际上您所要做的只是根据已经过的时间派生表单编号。