MySQL触发器搞定文章审核统计


关键词

MySQL 触发器 文章审核 审核统计

摘要

本文介绍使用MySQL触发器来解决文章审核的统计工作,全面涵盖了新增、修改、删除等操作对统计结果的影响。

创建一篇文章,然后需要审核才能正式发布,这是一个非常常见的规则。本文就介绍使用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

« MySQL中字符串类型的字段最大使用longtext来存储 设置MySQL使用utf8mb4编码来保存微信昵称中的表情符号 »