如何在不使用mysql事件的情况下每年插入新记录


how to insert new records each year without using mysql events

我的目标是每年都能增加学生的成绩也就是明年中一变成中二。我尝试使用**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或类似的函数。这个想法仍然是相同的,因为目前您正在复制每个学生行,而实际上您所要做的只是根据已经过的时间派生表单编号。

相关文章: