gpt4 book ai didi

MySQL 触发器变量和嵌套选择

转载 作者:行者123 更新时间:2023-11-29 00:54:37 25 4
gpt4 key购买 nike

我正在编写一个触发器,它会在学生每次完成考试作业时执行,并会根据他们当前在同学中的排名更新表格(最高分给出排名 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 |斯蒂芬|希尔维尤

所以我的学生userID = 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$$

但是,这会插入到我的表中
+++++++++++
用户名|排名 |
+++++++++++
2 | 0 |

既然它插入了 uid = 2,我相信它正在提取正确的值,而且我似乎无法弄清楚为什么 userRank 为 0,这意味着 rownum 没有递增。

我试图查明触发代码返回默认变量值的原因以及它是否基于嵌套选择。谁能指出问题所在?你能在 MySQL 触发器中进行嵌套选择吗?当我添加触发器时,没有抛出任何错误。

最佳答案

尝试将rownum设置为默认值

DECLARE rownum INTEGER DEFAULT 0

在您当前的触发器中,以下表达式

行数 = 行数 + 1

将评估为 NULL,因为 rownum 的默认值为 null。

另外 = 运算符检查是否相等(如“x 等于 y”),这意味着表达式将计算为真或假。由于 rownum 永远不会等于 rownum+1 ,因此您的结果将为假(这就是您在结果集中看到 0 的原因)。

编辑试试 SELECT rownum+1 INTO rownum

关于MySQL 触发器变量和嵌套选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6708013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com