종결 비율로 순위가 매겨진 직원 목록을 생성해야합니다.MySQL 5.7 주문이 임시 순위 열에 영향을주는 이유는 무엇입니까?
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|
왜 이런 경우가 아닙니까?
MySQL 스펙에서는 동일한 명령문에서 변수를 읽고 설정할 수 없습니다. Percona의 프로그래머는 특정 CASE 관용구가 현재 빌드의 코드를 기반으로 작동 함을 발견했습니다. 이것은 귀하의 문제 일 수도 있고 아닐 수도 있습니다 : [mcve]를 읽고 행동하십시오. – philipxy