1 问题描述
1.1 两个表的具体内容
第一个表:t_user_judge
- 包含:评委id、分配的评分作品数assignNum、完成的评分作品数judgeNum;
- 其他信息字段。
第二个表:t_distribute
- 包含:与评委id对应的userID、作品的workID、作品是否完成评价的标志字段completed(0:未评价,1:已评价);
- 其他得分情况等具体信息字段。
1.2 实现目标
根据表t_distribute中标志字段completed的完成情况,通过评委的userID对应到t_user_judge中,进一步更新分配的评分作品数assignNum、完成的评分作品数judgeNum两个字段。
1.3 具体思路
- 得到表t_distribute中的全部内容;
- 遍历得到的所有数据;
更新评分作品数assignNum字段;
- 该字段只需判断每位评委在t_distribute中是否存在分配的作品,无需判断是否完成评价;
- 找到该条数据在t_user_judge中相同的评委id,就可以计数。
更新完成的评分作品数judgeNum字段;
- 该字段需判断每位评委在t_distribute中是否存在分配的作品,并且需要判断标志字段completed是否为1;
- 找到该条数据在t_user_judge中相同的评委id,completed为1,可以计数。
2 运行结果
3 完整代码
CREATE PROCEDURE update_judge_work () BEGIN
DECLARE
uID INT;#uID:t_workd的userID字段
DECLARE
comp INT;#isC:t_workd的isCompetition字段
DECLARE
a INT;#a:游标遍历完的标志
DECLARE
mycursor CURSOR FOR SELECT
completed,
userID
FROM
t_distribute;
DECLARE
CONTINUE HANDLER FOR NOT FOUND
SET a = 1;#当读到数据的最后一条时,设置a变量为1
UPDATE t_user_judge
SET assignNum = 0;
UPDATE t_user_judge
SET judgeNum = 0;
SET uID = 0;
SET comp = 0;
SET a = 0;#初始化变量no为0
OPEN mycursor;#打开游标
WHILE
a = 0 DO#判断是不是到了最后一条数据
FETCH mycursor INTO comp,
uID;#读取游标中的数据分别一一存储
UPDATE t_user_judge
SET assignNum = assignNum + 1
WHERE
uID = t_user_judge.id;
UPDATE t_user_judge
SET judgeNum = judgeNum + 1
WHERE
uID = t_user_judge.id
AND comp = 1;
END WHILE;
CLOSE mycursor;#关闭游标,清理游标数据
END;
CALL update_judge_work ();