创建一篇文章,然后需要审核才能正式发布,这是一个非常常见的规则。本文就介绍使用MySQL触发器来统计各个分类/栏目下的未审核文章数量。
首先有一个文章表,test_article,还一个分类表,test_cate。文章表中有一个a_is_checked字段,表示是否已审核,已审核值为1,未审核值为0。分类表中有一个c_unchecked_num字段来统计该分类下的未审核文章数。
大概流程是这样的:
1、文章创建
创建时的文章默认是未审核的,所以给一个insert触发器,把新增文章对的分类记录的c_unchecked_num加1。
2、文章删除
删除文章时,要分情况。如果是删除已审核的,则计数不变。如果是删除未审核的,则对应分类的c_unchecked_num减1。
3、文章修改
这个就比较复杂了,得要分情况。先看看是否有修改文章的分类,如果没修改分类,那审核文章,则c_unchecked_num减1;把已审核的文章再设置成未审核,则c_unchecked_num加1。如果修改了分类,审核文章则新分类不受影响,旧分类下c_unchecked_num加1;把已审核的文章再设置成未审核,则新分类c_unchecked_num加1,旧分类不受影响。
完整的SQL语句如下:
-- ----------------- -- 分类 -- ----------------- DROP TABLE IF EXISTS `test_cate`; CREATE TABLE `test_cate` ( `c_id` int(11) NOT NULL AUTO_INCREMENT, `c_name` varchar(20) NOT NULL DEFAULT '' COMMENT '名称', `c_unchecked_num` int(11) NOT NULL DEFAULT '0' COMMENT '未审核数量', PRIMARY KEY (`c_id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '分类'; -- ----------------- -- 文章 -- ----------------- DROP TABLE IF EXISTS `test_article`; CREATE TABLE `test_article` ( `a_id` int(11) NOT NULL AUTO_INCREMENT, `a_name` varchar(20) NOT NULL DEFAULT '' COMMENT '名称', `cate_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联分类表的ID', `a_is_checked` int(1) NOT NULL DEFAULT '0' COMMENT '是否审核', PRIMARY KEY (`a_id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '文章'; DELIMITER // -- 插入 DROP TRIGGER IF EXISTS `article_insert`; CREATE TRIGGER article_insert AFTER INSERT ON test_article FOR EACH ROW BEGIN UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id; END// -- 审核 DROP TRIGGER IF EXISTS `article_update`; CREATE TRIGGER article_update AFTER UPDATE ON test_article FOR EACH ROW BEGIN IF NEW.cate_id=OLD.cate_id THEN -- 没改分类 IF OLD.a_is_checked=0 THEN -- 原来是未审核 IF NEW.a_is_checked=1 THEN /*现在是已审核*/ UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=NEW.cate_id; END IF; ELSE /* 原来是已审核 */ IF NEW.a_is_checked=0 THEN -- 现在是未审核 UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id; END IF; END IF; ELSE -- 修改了分类 IF OLD.a_is_checked=0 THEN -- 原来是未审核 IF NEW.a_is_checked=1 THEN -- 现在是已审核 -- 原分类-1 UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=OLD.cate_id; ELSE -- 现在是未审核 -- 原分类-1,新分类+1 UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=OLD.cate_id; UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id; END IF; ELSE /*原来是已审核*/ IF NEW.a_is_checked=0 THEN -- 现在是未审核 UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id; END IF; END IF; END IF; END// -- 删除 DROP TRIGGER IF EXISTS `article_delete`; CREATE TRIGGER article_delete AFTER DELETE ON test_article FOR EACH ROW BEGIN IF OLD.a_is_checked=0 THEN UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=OLD.cate_id; END IF; END// DELIMITER ;
关于使用MySQL触发器搞定文章审核统计,本文就介绍这么多,希望对大家有所帮助!
要饭二维码
洪哥写文章很苦逼,如果本文对您略有帮助,可以扫描下方二维码支持洪哥!金额随意,先行谢过!大家的支持是我前进的动力!
文章的版权
本文属于“洪哥笔记”原创文章,转载请注明来源地址:MySQL触发器搞定文章审核统计:http://www.splaybow.com/post/mysql-trigger-check-stat-133.html
如果您在服务器运维、网络管理、网站或系统开发过程有需要提供收费服务,请加QQ:8771947!十年运维经验,帮您省钱、让您放心!
亲,如果有需要,先存起来,方便以后再看啊!加入收藏夹的话,按Ctrl+D!
发布时间:2020/7/13 7:04:59 | 编辑:洪哥 | 分类:MySQL | 浏览: