我正在编写一个触发器,每当学生完成考试作业时都会执行该触发器,并将更新一张表格,了解他们当前在同学中的等级(最高分为等级1等)
我从以下查询开始,看看我是否可以从学生考试提交中获得有用的数据
SET @rownum := 0;
SET @school := 'hillview';
SELECT userID, rank, firstname, institution
FROM (
SELECT @rownum := @rownum + 1 AS rank, userID, firstname, institution FROM(
SELECT userID, sum(marks), firstname, institution
FROM competition_history
WHERE institution = @school
GROUP BY userID
ORDER BY marks DESC) as inner_rank
) as r
WHERE userID = 2;
返回了
的正确结果 ++++++++++++++++++++++++
uid | rank | fname |学校
++++++++++++++++++++++++
2 | 2 | stefan | hillview
所以我的appID = 2的学生排名第二,很棒,现在我想将其转换为触发器并将其写入只存储userID和rank的表
我试图将其转换为触发器(并删除硬编码的机构变量)
DELIMITER $$
DROP TRIGGER IF EXISTS CallRankProc;
CREATE TRIGGER callRankProc AFTER INSERT
ON competition_history
FOR EACH ROW
BEGIN
DECLARE rownum INTEGER DEFAULT 0;
DECLARE userRank INTEGER;
SELECT _rank into userRank
FROM (
SELECT rownum = rownum + 1 AS _rank, userID, firstname, institution FROM(
SELECT userID, sum(marks), firstname, institution
FROM competition_history
WHERE institution = NEW.institution
GROUP BY userID
ORDER BY marks DESC) as inner_rank
) as r
WHERE userID = NEW.userID;
INSERT INTO `student_ranks`(`userID`,`rank`) VALUES (NEW.userID,userRank)
ON DUPLICATE KEY UPDATE rank = userRank;
END$$
但是,这会插入我的表格中
+++++++++++
UID |排名|
+++++++++++
2 | 0 |
现在因为它插入了uid = 2我相信它正在提取正确的值,我似乎无法弄清楚为什么userRank为0,这意味着rownum没有递增。
我试图找出触发器代码返回默认变量值的原因,以及它是否基于嵌套选择。任何人都可以查明问题吗?你能在MySQL触发器中嵌套选择吗?当我添加触发器时,没有抛出任何错误。
答案 0 :(得分:1)
尝试将rownum设置为默认值
DECLARE rownum INTEGER DEFAULT 0
在当前触发器中,使用以下表达式
rownum = rownum + 1
由于rownum的默认值为null,将计算为NULL。
此外,=运算符检查相等性(如“x等于y”),这意味着表达式将计算为true或false。因为rownum永远不会等于rownum + 1,所以你的结果将是假的(这就是你在结果集中看到0的原因)。
修改强> 尝试SELECT rownum + 1 INTO rownum