繁体   English   中英

如何使用临时表的结果更新 MySQL 表

[英]How to update MySQL table with result from temp table

我有一个名为assp1的表,其中包含FirstNameLastNameMathsOverall_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM