emmm其实网上优秀的文章有很多,并且mysql也有官方文档,写这个是相当于记录自己的经历吧。
上面说升级的那里,是要执行一个定时任务,每三天执行一次。然后情况如下:
一个商品表,商品有一个id的属性,然后每个商品有关键词信息,对应一个商品-关键词中间表(通过商品id、关键词id为一个主键),关键词其他信息又存放在另一个表里面,这时候要统计商品表的关键词数量,因为实时统计耗费的时间太多了,只能通过定期更新的方式,并作为商品的一个属性。
商品表的每个商品都要进行更新的话,就用到游标来处理,大概思路是这样,首先从商品表获取每个商品的id形成一个集合,然后用游标和while循环遍历每个id,把id拿去中间表里面找到所有关键词id,再把这些关键词id去关键词表查找得出关键词的总数(一个商品对应多个关键词,需要把这些关键词的数量统计出来)
其实重点在于游标的应用和存储过程的应用(语法挺重要的),贴上代码:
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `test`.`yinliucount_new`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
DECLARE goodsid VARCHAR(255);
DECLARE keywordgoodsid VARCHAR(255);
DECLARE yinliuc INT;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT goodsurlid FROM store_goods;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
FETCH cur INTO goodsid;
WHILE done != 1 DO
SET keywordgoodsid = SUBSTRING_INDEX(goodsid,"_",-1);
SELECT COUNT(*) INTO yinliuc FROM (SELECT * FROM store_allkeyword WHERE keywordid IN(SELECT keywordid FROM store_goods_keyword WHERE goodsurlid = keywordgoodsid) GROUP BY keyword_name)d;
IF yinliuc IS NOT NULL THEN
UPDATE store_goods SET yinliu_count = yinliuc WHERE goodsurlid = goodsid;
END IF;
FETCH cur INTO goodsid;
END WHILE;
CLOSE cur;
END$$
DELIMITER ;
然后用 新建一个定时任务,注释都是一些例子
DELIMITER $$
-- SET GLOBAL event_scheduler = ON$$ -- required for event to execute but not create
CREATE /*[DEFINER = { user | CURRENT_USER }]*/ EVENT `weanalysis`.`d`
ON SCHEDULE EVERY 2 DAY STARTS '2018-07-13 16:00:00'
ON COMPLETION PRESERVE
ENABLE
/* uncomment the example below you want to use */
-- scheduleexample 1: run once
-- AT 'YYYY-MM-DD HH:MM.SS'/CURRENT_TIMESTAMP { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] }
-- scheduleexample 2: run at intervals forever after creation
-- EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]
-- scheduleexample 3: specified start time, end time and interval for execution
/*EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]
STARTS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1[HOUR|MONTH|WEEK|DAY|MINUTE|...] }
ENDS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] } */
/*[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']*/
DO
BEGIN
CALL test.`yinliucount_new`;
END$$
DELIMITER ;
然后就设置好了,其他具体的语法,是要去看mysql官方文档还有别人的博客的,我就不班门弄斧了,这个只是一个参考的小例子。