2015-01-19 2 views
0

먼저 selected_bookingcost으로 정렬 한 다음 모든 행에 인덱스 i을 할당해야합니다. 내 변형이 제대로 작동하지 않습니다 (외부 SELECT는 순서 나누기) : 외부 일을 할 때 내 선택의 순서를 저장할 수있는 방법이복잡한 쿼리에서 SELECT 결과의 순서를 저장

SELECT (@i:[email protected] + 1) AS i, selected_booking.* FROM (SELECT * FROM booking ORDER BY cost DESC) AS selected_booking;

있습니까?

+0

"로우 소스에서 행 순서 유지"를 제공하는 MySQL 구문을 인식하지 못합니다. 나는 아무 것도 있다고 생각하지 않는다. 특정 시퀀스에 행이 필요하면'ORDER BY' 절을 사용하십시오. 바깥 쪽 쿼리에서'ORDER BY selected_booking.cost DESC'에 대한 속기가 있는지 물어 보는 것처럼 보입니다. 그리고 그보다 더 짧습니다. (더 짧게 만드는 유일한 방법은 인라인 뷰/파생 테이블에 * 별칭 *을 사용하는 것입니다.) – spencer7593

답변

1

Q : 외부 선택을 수행 할 때 내부 선택 순서를 저장하는 방법이 있습니까?

A : 외부 쿼리에 ORDER BY 절이 없으면 MySQL은 임의의 순서로 행을 반환 할 수 있습니다.

인라인보기 (파생 테이블)의 행을 특정 순서로 반환하려면 외부 쿼리에서 외부 쿼리에 ORDER BY 절을 추가해야한다고 지정해야합니다.


참고 : 조회에서와 같이 사용자 정의 변수의 동작은 MySQL을 참조 설명서이 경고, 보장 없습니다. 그러나 경고에도 불구하고 MySQL 5.1과 5.5에서 반복적 인 동작을 관찰합니다.

예를 들어, 인라인보기 (예 : 파생 테이블, MySQL venacular)가 필요한 이유는 분명하지 않습니다. 오히려 별도의 SET 문보다

SET @i = 0 ; 
SELECT @i:[email protected]+1 AS i 
     , b.* 
    FROM booking b 
    ORDER BY b.cost DESC ; 

또는 단일 문에서이 작업을 수행 할 수 있으며, 쿼리 내에서 @i를 초기화 :이 쿼리는 당신이 원하는 것처럼 보이는 결과를 반환하는 것처럼

는 것 같습니다.

SELECT @i:[email protected]+1 AS i 
     , b.* 
    FROM booking b 
    JOIN (SELECT @i:=0) i 
    ORDER BY b.cost DESC 

(이 초기화는 MySQL은 인라인 뷰를 처리하는 방식 때문에이 동작을 보장 할 수 없습니다. 인라인 뷰 쿼리는 외부 쿼리하기 전에 실행, 다시 작동하고, (향후 릴리스에서 변경 될 수 있습니다 이미 주

) 5.6에서 변경 될 수 있습니다 :이 쿼리의 성능 향상을 위해 적절한 인덱스 선두 컬럼으로 cost에 사용할 수있는 경우, 예를 들어

MySQL이 그 인덱스를 사용할 수 있습니다
... ON booking (cost) 

행을 순서대로 반환하고 av oid a "파일 사용"작업.

+0

실제로 비용으로 정렬 된 예약을 받고 싶습니다. 주문을 어 기지 않는 색인. 나는 결과가 비용 DESC와 인덱스 ASC에 의해 동시에 정렬되어야 함을 의미한다. 여기에 외부 SELECT를 사용하려고합니다. 어쩌면 나는 외부 SELECT없이 다른 방법으로 그것을 할 수 있을까요? – Aliaxander

+1

'ORDER BY'가있는 동일한 쿼리에서 파생 열 'i'에 대한 대입을 수행하면됩니다. MySQL은 SELECT * 목록에서 표현식을 평가하기 전에 * 행을 "정렬"합니다. (이것은 보장 된 동작은 아니지만 MySQL 5에서 우리가 관찰 한 동작입니다.1 및 5.5) – spencer7593

+0

그 작품, 고마워! – Aliaxander

관련 문제