0

我的目标是能够每年增加学生表格,即明年表格 1 成为表格 2。我尝试使用 **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

任何对我如何以专业的方式做这件事有想法或建议的人

4

3 回答 3

1

由于这是一个每年运行一次的进程,我将创建一个运行该查询的外部进程(如果这是一个 Web 应用程序,则在您的管理模块中再添加一个页面,或者类似的东西,具体取决于您在做什么);这样,用户可以准确地控制它何时发生,并且实现起来非常简单。

于 2013-04-04T12:33:04.777 回答
0

一个 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
于 2013-04-04T12:35:15.397 回答
0

听起来您这里的数据库设计很差。您有一个学生,对于每个学生,您都想知道他们的表格。您似乎可以访问他们加入的年份,因此您可以存储“表格 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 或类似功能。这个想法仍然是相同的,因为目前您正在复制每个学生行,而实际上您所要做的只是根据经过的时间得出一个表格编号。

于 2013-04-04T12:49:34.327 回答