這聽起來像你在這裏有一個貧窮的數據庫設計。你有一個學生,併爲每個學生你想知道他們是什麼形式。你似乎有權訪問他們加入的一年,所以你可以存儲一個「形式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改爲DATE字段,並使用DATEDIFF或類似的功能。這個想法仍然是一樣的,因爲目前你正在複製每個學生的行,而實際上你所要做的就是根據已經過去的時間派生一個表單編號。
我同意okaram,外部計劃任務(cron job等)很可能是前進的方向,因爲那時你可以精確地指定它每年運行的時間和所有類型的事情。真的你正在運行的查詢基本上'INSERT INTO students(student_id,form,year)SELECT student_id,MAX(form)+ 1,MAX(year)+1 FROM students GROUP BY student_id;' – 2013-04-04 12:35:37
如何創建外部計劃任務??? – internally1 2013-04-04 12:41:21
你可以創建一個php頁面,increment_year.php來運行你的查詢;最終用戶需要訪問此頁面,因此您需要確保管理員在菜單中有鏈接。另一種選擇是cron/at工作,但我會提前一年安排某些事情會感到厭倦:)另外,您可以計算一種計算該年的方法,因此您可以存儲進入年份,然後根據當前時間日期 – okaram 2013-04-04 12:46:52