簡體   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