ORDER BY
절의 작동 방식과 FIELD()
함수의 작동 방식을 이해합니다 . 내가 이해하고 싶은 것은 두 가지가 함께 작동하여 정렬하는 방법입니다. 행은 어떻게 검색되고 정렬 순서는 어떻게 파생됩니까?
+----+---------+
| id | name |
+----+---------+
| 1 | stan |
| 2 | kyle |
| 3 | kenny |
| 4 | cartman |
+----+---------+
SELECT * FROM mytable WHERE id IN (3,2,1,4) ORDER BY FIELD(id,3,2,1,4)
위의 쿼리는
+----+---------+
| id | name |
+----+---------+
| 3 | kenny |
| 2 | kyle |
| 1 | stan |
| 4 | cartman |
+----+---------+
ORDER BY 3, 2, 1, 4와 비슷한 말
질문
- 내부적으로 어떻게 작동합니까?
- MySQL은 어떻게 행을 가져오고 정렬 순서를 계산합니까?
- MySQL은 id 열을 기준으로 정렬해야한다는 것을 어떻게 알 수 있습니까?
답변
기록을 위해
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
WHERE
절의 목록을 주문할 필요가 없기 때문에 잘 작동합니다.
작동 방식은
-
FIELD () 는 검색하려는 값이 존재하는 경우 쉼표로 구분 된 목록의 색인 위치를 반환하는 함수입니다.
- IF id = 1이면 FIELD (id, 3,2,1,4) 는 3 (1이 목록에있는 위치 )을 반환합니다.
- IF id = 2이면 FIELD (id, 3,2,1,4) 는 2를 리턴합니다 (2가 목록에있는 위치)
- IF id = 3이면 FIELD (id, 3,2,1,4) 는 1 (3이 목록에있는 위치 )을 반환합니다.
- IF id = 4이면 FIELD (id, 3,2,1,4) 는 4 (4가 목록에있는 위치 )를 반환합니다.
- IF id = 다른 항목이면 FIELD (id, 3,2,1,4) 는 0을 반환합니다 (목록에 없음)
-
ORDER BY
값이 무엇에 의해 평가 분야 () 반환
모든 종류의 멋진 주문을 만들 수 있습니다
예를 들어 IF () 함수 사용
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
이렇게하면 처음 4 개의 ID가 목록의 맨 위에 나타나고 그렇지 않으면 맨 아래에 나타납니다. 왜?
에서 ORDER BY
0 또는 1을 얻습니다.
- 첫 번째 열이 0이면 처음 4 개의 ID 중 하나가 나타나도록합니다
- 첫 번째 열이 1이면 나중에 표시하십시오.
첫 번째 열에서 DESC로 뒤집어 봅시다
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
에서 ORDER BY
여전히 0 또는 1을 얻습니다.
- 첫 번째 열이 1이면 첫 번째 4 개의 ID 이외의 것을 표시하십시오.
- 첫 번째 열이 0이면 처음 4 개의 ID가 원래 순서대로 표시됩니다.
실제 질문
이것에 대해 내부를 심각하게 원한다면 , 책의 189 쪽과 192쪽으로 가십시오
실제 심해 다이빙.
본질적으로 ORDER *order
( ORDER BY
식 트리) 라는 C ++ 클래스가 있습니다. 에서가 JOIN::prepare
, *order
라는 함수에 사용됩니다 setup_order()
. 수업 중간에 왜 JOIN
? 모든 쿼리, 단일 테이블에 대한 쿼리조차도 항상 JOIN으로 처리됩니다 (내 게시물 참조 JOIN 조건과 WHERE 조건 사이에 실행 차이가 있습니까? )
이 모든 소스 코드는 sql/sql_select.cc
분명히 ORDER BY
나무는에 대한 평가를 보유 할 것입니다 FIELD(id,3,2,1,4)
. 따라서 숫자 0,1,2,3,4는 관련된 행을 참조하면서 정렬되는 값입니다.
답변
어쩌면 이것은 실제 코드와 너무 멀어서 원하는 수준에서 충분히 낮지 않을 것입니다.
MySQL이 인덱스를 사용하여 정렬 된 순서로 데이터를 검색 할 수없는 경우 선택한 모든 열과 추가 데이터가있는 임시 테이블 / 결과를 생성합니다. 그중 하나는 각 행의 ORDER BY 표현식 값 결과를 저장하는 일종의 열입니다. 그런 다음이 tmp 테이블을 정렬 할 열이 포함 된 “filesort”루틴으로 보냅니다. 그런 다음 행이 정렬 순서대로 정렬되어 하나씩 열을 선택하고 선택한 열을 반환 할 수 있습니다.