mysql預存程序,實現兩個遊標的迴圈

來源:互聯網
上載者:User

  今天用php開發網站,遇到一個需求。統計網站關鍵詞的google流量,計算本周某個關鍵詞對於上周的google流量的增長。goole流量統計是通過日誌剖析器擷取。本打算差值計算也用php實現,但是一想還要迴圈查詢資料庫,會造成資料庫壓力,於是乎編寫了一個預存程序。

  首先資料結構:

  CREATE TABLE `mobile_keywords_weeklog` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `topdate` date DEFAULT NULL,

  `keywords_id` int(11) DEFAULT '0',

  `s_pv` int(11) DEFAULT '0',

  `s_gv` int(11) DEFAULT '0',

  `s_bv` int(11) DEFAULT '0',

  `d_value` int(11) DEFAULT '0' COMMENT '與上一周的差值',

  PRIMARY KEY (`id`),

  KEY `topdate` (`topdate`),

  KEY `keywords_id` (`keywords_id`),

  KEY `s_pv` (`s_gv`)

  ) ENGINE=MyISAM AUTO_INCREMENT=702 DEFAULT CHARSET=latin1

  預存程序,實現了雙遊標的迴圈:

  DELIMITER $$

  USE `brother_mobile`$$

  DROP PROCEDURE IF EXISTS `pro_week_stat`$$

  CREATE DEFINER=`root`@`%` PROCEDURE `pro_week_stat`()

  top:BEGIN

  DECLARE done INT DEFAULT 0;

  DECLARE curr_week DATE;

  DECLARE last_week DATE;

  DECLARE a1,b1,c1 INT;

  DECLARE a2,b2,c2 INT;

  DECLARE d INT;

  DECLARE is_update INT DEFAULT 0;

  DECLARE all_week CURSOR FOR SELECT topdate FROM brother_mobile.mobile_keywords_weeklog GROUP BY topdate ORDER BY topdate DESC LIMIT 0,2;

  DECLARE cur1 CURSOR FOR SELECT id,keywords_id,s_gv FROM brother_mobile.mobile_keywords_weeklog WHERE topdate = curr_week;

  DECLARE cur2 CURSOR FOR SELECT id,keywords_id,s_gv FROM brother_mobile.mobile_keywords_weeklog WHERE topdate = last_week;

  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN all_week;

  FETCH all_week INTO curr_week;

  FETCH all_week INTO last_week;

  CLOSE all_week;

  IF IFNULL(curr_week,'')='' OR IFNULL(last_week,'')='' THEN

  LEAVE top;

  END IF;

  OPEN cur1;

  out_repeat:REPEAT

  FETCH cur1 INTO a1,b1,c1;

  BEGIN

  DECLARE done1 INT DEFAULT 0;

  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done1 = 1;

  OPEN cur2;

  inner_repeat:REPEAT

  FETCH cur2 INTO a2,b2,c2;

  IF NOT done THEN

  SET is_update=0;

  IF b1 = b2 THEN

  SET d = c1-c2;

  SET is_update = 1;

  UPDATE brother_mobile.mobile_keywords_weeklog SET d_value = d WHERE id = a1;

  LEAVE inner_repeat;

  END IF;

  END IF;

  UNTIL done1 END REPEAT inner_repeat;

  CLOSE cur2;

  END;

  IF is_update <> 1 THEN

  UPDATE brother_mobile.mobile_keywords_weeklog SET d_value = c1 WHERE id = a1;

  END IF;

  UNTIL done END REPEAT out_repeat;

  CLOSE cur1;

  END$$

  DELIMITER ;

  其中預存程序中的具體文法可以查看mysql的協助文檔。

 

  最後用call pro_week_stat()調用即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.