我的目标是每年能够提供学生表格 即明年将成为形式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
任何一个有关于我如何以专业方式做事的想法或建议的人
答案 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或类似功能。这个想法仍然是一样的,因为目前你正在复制每个学生行,而实际上你所要做的就是根据时间推断出一个表格编号。