我試圖回答另一個SO question,並突然遇到以下問題。積分應分配給每個班級的最高3分(mrk
)組(grp
)(sec
)。得分最高的隊伍得到5分,排名第二的得分爲3分,排在第三的得分只有1分。對於所有其他pts
應設置爲null
。如何在UPDATE語句中使用用戶定義的變量?
| ID | SEC | GRP | MRK | PTS |
|----|-----|-----|-----|--------|
| 1 | cl2 | ge | 32 | (null) |
| 2 | cl1 | gb | 22 | (null) |
| 3 | cl1 | gd | 22 | (null) |
| 4 | cl1 | ge | 18 | (null) |
| 5 | cl2 | ga | 26 | (null) |
| 6 | cl1 | ga | 55 | (null) |
| 7 | cl2 | gb | 66 | (null) |
| 8 | cl2 | gc | 15 | (null) |
| 9 | cl1 | gc | 12 | (null) |
| 10 | cl2 | gf | 5 | (null) |
| 11 | cl2 | ge | 66 | (null) |
我選擇了與用戶定義的變量來工作,因爲他們提供了關於分配方案最大的靈活性,並很快想出了以下解決方案:
說明的NULLIF(@i:=5,(@s:=sec)=(@m:=mrk))
SELECT id,sec,grp,mrk,
CASE WHEN @s=sec THEN -- whenever there is a new class ...
CASE WHEN @m=mrk THEN @i ELSE -- issue the same points for
-- identical scorers, otherwise ...
CASE WHEN IF(@m:=mrk,@i,@i)>2 THEN @i:[email protected] -- store mrk in @mrk and
-- while @i>2 return points: 3 or 1 ...
ELSE @i:=null -- no points for the rest
END
END
ELSE NULLIF(@i:=5,(@s:=sec)=(@m:=mrk)) -- store sec in @s and mrk in @m
-- and return points: 5
END pts
FROM tbl ORDER BY sec,mrk desc
:
的表達式@s:=sec
和@m:=mrk
都被評估,然後通過=
比較它們的值。結果可以是0
(false)或1
(true),但肯定不等於5
,這是NULLIF
函數的另一個參數,因此最終只返回第一個參數(5
)。我選擇了這個構造來完成這兩個變量賦值而不返回任何內容。好吧,也許不是最直接的解決方案;-),但我確實注意爲每個正在處理的記錄只定義一個變量一次,因爲「涉及用戶變量的表達式的評估順序是不確定的「mysql manual。該select
確實給了我想要的
結果:
| ID | SEC | GRP | MRK | PTS |
|----|-----|-----|-----|--------|
| 6 | cl1 | ga | 55 | 5 |
| 2 | cl1 | gb | 22 | 3 |
| 3 | cl1 | gd | 22 | 3 |
| 4 | cl1 | ge | 18 | 1 |
| 9 | cl1 | gc | 12 | (null) |
| 7 | cl2 | gb | 66 | 5 |
| 11 | cl2 | ge | 66 | 5 |
| 1 | cl2 | ge | 32 | 3 |
| 5 | cl2 | ga | 26 | 1 |
| 8 | cl2 | gc | 15 | (null) |
| 10 | cl2 | gf | 5 | (null) |
現在,我的問題是:
我怎樣寫沿,將上面的計算結果存儲在同一行的UPDATE
聲明列pts
?
我嘗試到目前爲止都失敗了:
UPDATE tbl SET pts=
CASE WHEN @s=sec THEN
CASE WHEN @m=mrk THEN @i ELSE
CASE WHEN IF(@m:=mrk,@i,@i)>2 THEN @i:[email protected]
ELSE @i:=null
END
END
ELSE NULLIF(@i:=5,(@s:=sec)=(@m:=mrk))
END
ORDER BY sec,mrk desc
結果:
| ID | SEC | GRP | MRK | PTS |
|----|-----|-----|-----|-----|
| 6 | cl1 | ga | 55 | 5 |
| 2 | cl1 | gb | 22 | 5 |
| 3 | cl1 | gd | 22 | 5 |
| 4 | cl1 | ge | 18 | 5 |
| 9 | cl1 | gc | 12 | 5 |
| 7 | cl2 | gb | 66 | 5 |
| 11 | cl2 | ge | 66 | 5 |
| 1 | cl2 | ge | 32 | 5 |
| 5 | cl2 | ga | 26 | 5 |
| 8 | cl2 | gc | 15 | 5 |
| 10 | cl2 | gf | 5 | 5 |
爲什麼更新語句只獲得PTS單一值(5)?!?
您可以在我的SQLfiddle中找到所有數據和SQL語句。
你希望的更新結果。 –
@echo_Me我希望的更新結果列在我的帖子下的「選擇的確給了我想要的結果:」。僅供參考:我也嘗試將'SELECT'輸出插入到(臨時)表格中 - >與我的帖子底部顯示的結果相同:-( – cars10m