Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在不使用mysql事件的情况下每年插入新记录_Php_Mysql - Fatal编程技术网

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

Php 如何在不使用mysql事件的情况下每年插入新记录,php,mysql,Php,Mysql,我的目标是每年都能起诉学生 i、 我试着使用**mysql事件**,但对于我的情况来说似乎很复杂。 我有下列表格 id student_id form year ---------- 1 2013-04-04888 1 2013 2 2013-04-01920 2 2013 一年后,我想要这样的东西 id student_id form

我的目标是每年都能起诉学生 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

任何一个对我如何以专业的方式进行这项工作有想法或建议的人

由于这是一个每年运行一次的流程,我会创建一个外部流程,在你的管理模块中运行一个以上的页面,如果这是一个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年表中,你可以使用如下两种方法来计算他们的当前年份。首先,如果您想用“已完成”替换表格>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更改为日期字段,并使用DATEDIFF或类似函数。这个想法仍然是一样的,因为目前你正在复制每个学生行,而实际上你所做的只是根据经过的时间推导一个表单编号。

我同意okaram的观点,外部计划任务cron job等可能是未来的发展方向,因为这样您就可以精确地指定它每年运行的时间以及诸如此类的事情。实际上,您正在运行的查询基本上是插入到学生组中的学生id、表单、年份按学生id从学生组中选择学生id、MAXform+1、MAXyear+1;您可以创建一个php页面increment_year.php来运行您的查询;最终用户需要访问这个页面,所以你要确保管理员在你的菜单中有一个指向它的链接。另一个选项是cron/at作业,但我已经厌倦了提前一年安排一些事情:另外,你可以找到一种方法来计算那一年,所以你可以存储进入年份,你可以根据今天的datethenx@werner waage计算…但是我可以把这个代码放在哪个文件上,因为我在这个web应用程序上有很多文件…请帮助哇,就是这样…但是你能帮我选择不包括日期的年份吗,因为所有学生在一年中的同一天开始学习,即使是他几天后才开始,但假设他已经开始和其他学生在那个表格中。我不确定我是否理解那个评论,我恐怕,因为在你要选择的内容中/ooh,现在我想你,我只是对我自己感到困惑…然后X提前但还有一件事是文表格=4,我需要停止起诉年开始的表格1,我想当表格>5时,form=completed使用另一个子查询可以做到这一点,请参见上文。这将检查表单是否大于4,如果大于4,则输出“已完成”。或者,如果您希望使用最小值来保持数值,那么将最大值限制为5