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

时间:2013-04-04 12:28:45

标签: php mysql

我的目标是每年能够提供学生表格 即明年将成为形式2.i尝试使用** 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

任何一个有关于我如何以专业方式做事的想法或建议的人

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分: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”年开始,您可以使用以下两种方式计算当前年份。首先,如果您想将表单&gt; 4替换为'completed'

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或类似功能。这个想法仍然是一样的,因为目前你正在复制每个学生行,而实际上你所要做的就是根据时间推断出一个表格编号。