私は、閉鎖のパーセントでランクされた従業員のリストを生成する必要があります。それはなぜMySQL 5.7の注文は一時ランク列に影響しますか?
| Rank | Employee | Close | Open | Percent|
| 1| Smith| 9| 1| 0.90|
| 2| Jones| 75| 25| 0.75|
| 3| Zed| 1| 9| 0.10|
| 3| Adams| 10| 90| 0.10|
このクエリは、その目的のために動作しますが、それは正しく返すべきではないようにクエリを検討した後、見た目を返し
SET @cnt = 0;
SET @percent = 2.0;
SELECT
CASE
WHEN stats.close/(stats.open+stats.close) = @percent THEN @cnt
ELSE (@cnt := @cnt + 1)
END rank,
stats.employee,
stats.close,
stats.open,
(@percent := stats.close/(stats.open+stats.close)) percent
FROM stats
WHERE stats.date = CURDATE()
ORDER BY percent
:私は、次のストアドプロシージャを構築しました。これは私がそう思う理由です:
MySQLはORDER BYを処理する前にSELECTを処理します。私はそれによって、MySQLがデータベースから出てきた結果を並べ替えることを決めた順序でランクを割り当てると仮定します。
| Rank | Employee | Close | Open | Percent|
| 3| Smith| 9| 1| 0.90|
| 2| Jones| 75| 25| 0.75|
| 4| Zed| 1| 9| 0.10|
| 1| Adams| 10| 90| 0.10|
なぜこれが当てはまりませんか?
MySQL仕様では、同じステートメントで変数を読み書きすることはできません。 Perconaのプログラマーは、特定のCASEイディオムが現在のビルドのコードに基づいて動作することを発見しました。これはあなたの問題かもしれません:[mcve]を読んで行動してください。 – philipxy