[英]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.