我需要生成按关闭百分比排名的员工列表。我构建了以下存储过程:
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
它返回
| 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|
此查询适用于其预期目的,但在查看查询后,它看起来不应该正确返回。这就是我这么认为的原因:
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|
为什么不是这样?