January 12, 2009
最近要來做統計的程式,類似要算出使用者點擊使用情況的,然後另存成一張Table,使用的資料庫是MySQL,本來我是想要用JAVA程式寫的,但後來我覺得很還是麻煩,不知是否有沒有辦法全在SQL指令裡完成呢?
所以就花了點時間大概查了一下,喔!有找到唷!有Stored Procedures(這裡)可以寫程式,Cursor(這裡)可以把Select出來的資料用Loop迴圈(這裡)處理,看來我想要做的事似乎是可行呢!真是另我相當的雀躍!不過好像是在MySQL 5.0之後才支援的樣子,下面就簡單記一下用法,備忘一下。
這裡用Stored Procedures來寫,所以一開始要先轉換Delimiter從原先的分號[;]到兩個斜線[//],其實要換成別的也行,像是錢符號[$$]也蠻不錯的,高興就好!
DELIMITER //
好了然後就可以開始編寫程式了,如下:
CREATE PROCEDURE test(y CHAR(4))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE i INT;
DECLARE c INT;
DECLARE x CHAR(20);
DECLARE cur CURSOR FOR SELECT dbid FROM dblist;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO x;
SET i = 0;
REPEAT
SET i = i + 1;
IF (i < 10) THEN
SELECT COUNT(*) INTO c FROM log WHERE dbid = x AND cretime LIKE CONCAT(y, '-0', i, '%');
ELSE
SELECT COUNT(*) INTO c FROM log WHERE dbid = x AND cretime LIKE CONCAT(y, '-', i, '%');
END IF;
REPLACE INTO totaluse(dbid, year, month, click) VALUES (x, y, i, c);
UNTIL (i >= 12) END REPEAT;
UNTIL done END REPEAT;
CLOSE cur;
END//
** 在totaluse表內dbid, year, month是組合唯一鍵,用REPLACE若存在就會覆蓋過去,不存在就是插入。
以上比較要注意的有CURSOR要用FETCH把資料存到變數裡,HANDLER是處理當資料跑完時的情況,所以當CURSOR的資料跑完後就會做相對應的動作,SELECT INTO語句是將查出來的值存到變數裡,CONCAT是做字串連接用的,然後最後要用的時候就只要下一道指令即可,像是算去年的統計:CALL test('2008')
大概就醬吧!
所以就花了點時間大概查了一下,喔!有找到唷!有Stored Procedures(這裡)可以寫程式,Cursor(這裡)可以把Select出來的資料用Loop迴圈(這裡)處理,看來我想要做的事似乎是可行呢!真是另我相當的雀躍!不過好像是在MySQL 5.0之後才支援的樣子,下面就簡單記一下用法,備忘一下。
這裡用Stored Procedures來寫,所以一開始要先轉換Delimiter從原先的分號[;]到兩個斜線[//],其實要換成別的也行,像是錢符號[$$]也蠻不錯的,高興就好!
DELIMITER //
好了然後就可以開始編寫程式了,如下:
CREATE PROCEDURE test(y CHAR(4))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE i INT;
DECLARE c INT;
DECLARE x CHAR(20);
DECLARE cur CURSOR FOR SELECT dbid FROM dblist;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO x;
SET i = 0;
REPEAT
SET i = i + 1;
IF (i < 10) THEN
SELECT COUNT(*) INTO c FROM log WHERE dbid = x AND cretime LIKE CONCAT(y, '-0', i, '%');
ELSE
SELECT COUNT(*) INTO c FROM log WHERE dbid = x AND cretime LIKE CONCAT(y, '-', i, '%');
END IF;
REPLACE INTO totaluse(dbid, year, month, click) VALUES (x, y, i, c);
UNTIL (i >= 12) END REPEAT;
UNTIL done END REPEAT;
CLOSE cur;
END//
** 在totaluse表內dbid, year, month是組合唯一鍵,用REPLACE若存在就會覆蓋過去,不存在就是插入。
以上比較要注意的有CURSOR要用FETCH把資料存到變數裡,HANDLER是處理當資料跑完時的情況,所以當CURSOR的資料跑完後就會做相對應的動作,SELECT INTO語句是將查出來的值存到變數裡,CONCAT是做字串連接用的,然後最後要用的時候就只要下一道指令即可,像是算去年的統計:CALL test('2008')
大概就醬吧!




















