[英]How to update MySQL table with result from temp table
我有一个名为assp1的表,其中包含FirstName 、 LastName 、 Maths和Overall_Ranking 字段。 我正在运行一个查询,该查询将根据数学分数对每个学生进行排名。 该查询工作正常,但它有一个临时表的临时变量。 所以它只显示查询的结果而不影响表。 我想要的是将查询结果放入Overall_Ranking字段。 这样排名就会按降序显示谁排在最后。 下面是代码,请说明如何将结果放入assp1表的Overall_Ranking列。
SELECT assp1.FirstName, assp1.Maths, assp1.LastName, @prev := @curr , @curr := Total_Score, @rank := IF( @prev = @curr , @rank , @rank +1 ) AS Overall_Ranking
FROM assp1, (
SELECT @curr := NULL , @prev := NULL , @rank :=0
)tmp_tbl
WHERE assp1.Grade = 'Grade7' && assp1.class = '7A' && YEAR( assp1.created_at ) = YEAR( CURDATE( ) )
ORDER BY assp1.Total_Score DESC
基本上你加入原始和你的 SELECT
我简化了你的查询
UPDATE assp1 a INNER JOIN (SELECT assp1.FirstName, assp1.Maths, assp1.LastName, @rank := IF( @curr = Total_Score , @rank , @rank +1 ) AS Overall_Ranking, @curr := Total_Score as Total_Score
FROM assp1, (
SELECT @curr := NULL , @prev := NULL , @rank :=0
)tmp_tbl
WHERE assp1.Grade = 'Grade7' && assp1.class = '7A' && YEAR( assp1.created_at ) = YEAR( CURDATE( ) )
ORDER BY assp1.Total_Score DESC) b ON a.FirstName = b.FirstName AND a.Maths = b.Maths AND a.LastName = b.LastName
SET a.Overall_Ranking = b.Overall_Ranking
我强烈建议您使用 window 功能:
UPDATE assp1 a JOIN
(SELECT a.*,
RANK() OVER (PARTITION BY a.Total_Score DESC) as seqnum
FROM assp1 a
WHERE a.Grade = 'Grade7' AND A.class = '7A' AND
YEAR( assp1.created_at ) = YEAR( CURDATE( ) )
) a2
ON a.FirstName = a2.FirstName AND a.LastName = a2.LastName
SET a.overall_ranking = a2.seqnum;
请注意,这假定学生姓名对于标识每一行都是唯一的。
为什么我推荐这个? 首先,在 MySQL 中不推荐在非SET
语句中设置变量,从 MySQL 8.0 开始。 因此,变量并不是通往 go 的方法。
其次,如果您要在 MySQL 的早期版本中使用变量,那么您必须非常小心: MySQL 不保证表达式的计算顺序。 因此,您不能在一个表达式中设置变量并在另一个表达式中安全地使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.