MySQL数据库需求:创建触发器计算关键词匹配度并更新instructor表字段
实现MySQL触发器计算课程与讲师研究领域匹配度
首先得明确几个表的核心关联逻辑(基于常规场景假设,你可根据实际表结构调整):
researchArea:存储研究领域关键词,示例结构:id INT PRIMARY KEY, keyword VARCHAR(100)instructor:讲师表,示例结构:id INT PRIMARY KEY, research_area_id INT, matchingvalue INT, ...(research_area_id关联researchArea.id)course:课程表,示例结构:id INT PRIMARY KEY, instructor_id INT, course_text TEXT, ...(instructor_id关联instructor.id,course_text为待匹配的课程文本内容)
第一步:创建计算匹配百分比的自定义函数
因为触发器需重复执行匹配逻辑,先封装一个函数来统计关键词匹配数并计算整数百分比:
DELIMITER // CREATE FUNCTION calculate_match_percent(instructor_id INT) RETURNS INT DETERMINISTIC BEGIN DECLARE total_keywords INT; DECLARE matched_keywords INT; DECLARE research_keyword VARCHAR(100); DECLARE done INT DEFAULT 0; -- 游标:获取该讲师关联的所有研究领域关键词 DECLARE keyword_cursor CURSOR FOR SELECT ra.keyword FROM researchArea ra JOIN instructor i ON ra.id = i.research_area_id WHERE i.id = instructor_id; -- 处理游标结束状态 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 初始化计数变量 SET total_keywords = 0; SET matched_keywords = 0; -- 遍历关键词统计匹配情况 OPEN keyword_cursor; keyword_loop: LOOP FETCH keyword_cursor INTO research_keyword; IF done = 1 THEN LEAVE keyword_loop; END IF; SET total_keywords = total_keywords + 1; -- 检查课程文本是否包含关键词(不区分大小写) IF EXISTS ( SELECT 1 FROM course c WHERE c.instructor_id = instructor_id AND LOWER(c.course_text) LIKE CONCAT('%', LOWER(research_keyword), '%') ) THEN SET matched_keywords = matched_keywords + 1; END IF; END LOOP; CLOSE keyword_cursor; -- 计算百分比(避免除以0) IF total_keywords = 0 THEN RETURN 0; ELSE RETURN ROUND((matched_keywords / total_keywords) * 100); END IF; END // DELIMITER ;
第二步:创建触发器更新匹配值
根据业务场景选择对应的触发器:
场景1:课程内容插入/更新时,同步更新对应讲师的匹配值
DELIMITER // CREATE TRIGGER update_instructor_match_on_course_insert AFTER INSERT ON course FOR EACH ROW BEGIN UPDATE instructor i SET i.matchingvalue = calculate_match_percent(NEW.instructor_id) WHERE i.id = NEW.instructor_id; END // DELIMITER ; -- 课程内容更新时的触发器 DELIMITER // CREATE TRIGGER update_instructor_match_on_course_update AFTER UPDATE ON course FOR EACH ROW BEGIN UPDATE instructor i SET i.matchingvalue = calculate_match_percent(NEW.instructor_id) WHERE i.id = NEW.instructor_id; END // DELIMITER ;
场景2:讲师关联的研究领域变化时,更新匹配值
DELIMITER // CREATE TRIGGER update_instructor_match_on_research_change AFTER UPDATE ON instructor FOR EACH ROW BEGIN IF OLD.research_area_id != NEW.research_area_id THEN UPDATE instructor i SET i.matchingvalue = calculate_match_percent(NEW.id) WHERE i.id = NEW.id; END IF; END // DELIMITER ;
注意事项
- 触发器和函数中的表字段名必须与你项目的实际表结构完全对应,比如课程文本字段不是
course_text的话,要替换为真实字段名 - 若讲师关联多个研究领域,上述函数会遍历所有关联关键词统计匹配数量
- 当前为模糊包含匹配,如需整词精准匹配,可将
LIKE替换为正则匹配:REGEXP CONCAT('[[:<:]]', LOWER(research_keyword), '[[:>:]]')(MySQL原生整词匹配正则) - 若
researchArea与instructor为多对多关联(需通过中间表如instructor_research关联),需修改函数内的游标查询语句,关联中间表获取讲师的所有研究关键词
内容的提问来源于stack exchange,提问作者Seçkin Kurtalan
相关产品推荐
相关产品推荐

