2013-04-04 101 views
0

我的目標是每年都能夠煽動學生形式 即明年的形式1將形成2.i嘗試使用** mysql事件**但似乎是我的情況很複雜。 我有以下表如何在不使用mysql事件的情況下每年插入新記錄

id  student_id  form  year 
---------- 
    1  2013-04-04888  1  2013 
    2  2013-04-01920  2  2013 

1年我想有這樣的事情

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 

如何,我可以在這個業餘體校方式

做任何一個有想法或建議

回答

1

因爲這是一個每年運行一次的進程,所以我會創建一個運行該查詢的外部進程(管理模塊中還有一個頁面,如果這是一個Web應用程序,或者類似的東西取決於y你在做什麼);這樣,用戶可以準確地控制它發生的時間,而且實現起來也非常簡單。

+0

我同意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

+0

如何創建外部計劃任務??? – internally1 2013-04-04 12:41:21

+0

你可以創建一個php頁面,increment_year.php來運行你的查詢;最終用戶需要訪問此頁面,因此您需要確保管理員在菜單中有鏈接。另一種選擇是cron/at工作,但我會提前一年安排某些事情會感到厭倦:)另外,您可以計算一種計算該年的方法,因此您可以存儲進入年份,然後根據當前時間日期 – okaram 2013-04-04 12:46:52

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 
+0

thenx @werner waage ...但在哪個文件上可以放這個代碼,因爲我有很多這個web應用程序上的文件..... plz幫助 – internally1 2013-04-04 12:40:12

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」的一年,那麼你可以通過使用一些計算其當年像以下兩個。首先,如果你想更換形式> 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或類似的功能。這個想法仍然是一樣的,因爲目前你正在複製每個學生的行,而實際上你所要做的就是根據已經過去的時間派生一個表單編號。

+0

哇這是它...但你能幫我選擇不包括日期的年份,因爲所有的學生都是在一年的同一天開始的,即使他是在幾天後開始的,但是已經開始與這種形式的其他學生一起開始了。 – internally1 2013-04-04 13:11:22

+0

我不知道我明白那個評論我害怕,因爲在你想要選擇/ – 2013-04-04 13:15:23

+0

ooooh現在我gat你,我只是與自己混淆......然後提前 – internally1 2013-04-04 14:05:38

相關問題