MySQL触发器变量和嵌套选择

时间:2011-07-15 13:52:14

标签: mysql

我正在编写一个触发器,每当学生完成考试作业时都会执行该触发器,并将更新一张表格,了解他们当前在同学中的等级(最高分为等级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触发器中嵌套选择吗?当我添加触发器时,没有抛出任何错误。

1 个答案:

答案 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