2013-01-16 3 views
0

연속적으로 최저 또는 최고로 행을 정렬하려고 시도하거나 오히려 반복적으로 MySql을 사용하여 정렬합니다. 예를 들어 : 열에 다음 값이있는 경우 : 1,3,2,4,2,1,4,3,5 그러면 1,2,3,4,5,1,2와 같이 끝나야합니다. 3,4. 따라서 가장 낮은 것부터 가장 높은 것까지 가면서 가장 낮은 것부터 가장 높은 것까지 여러 번 다시 정렬하려고 시도합니다.MySql은 조건부로 오름차순으로 정렬합니다.

+0

정렬이 "시작될 때"의 기초를 결정하는 다른 열이 있습니까? –

+0

PK는 무엇입니까? – Strawberry

+0

@Mike no, 다른 항목이 없습니다. – user1074861

답변

0

을 다음을 고려, 반차 조인 조작 (딸기의 대답의 방법)는 다루기 결과 집합을 생성 할 수있다. (. 그럼 다시, MySQL은 거기에 몇 가지 최적화를 할 수 있습니다)

MySQL의에서 사용할 수있는 또 다른 방법은 다음과 같이 "사용자 변수"를 사용하는 것입니다

SELECT r.mycol 
    FROM (SELECT IF([email protected],@seq := @seq + 1,@seq := 1) AS seq 
       , @prev := q.mycol AS mycol 
      FROM mytable q 
      JOIN (SELECT @prev := NULL, @seq := NULL) p 
      ORDER BY q.mycol 
     ) r 
ORDER BY r.seq, r.mycol 

날 조금,하고 설명하는 것이 풀어 보자 무엇을 내부 쿼리 (인라인 뷰는 r으로 앨리어스 (alias) 된 것부터 시작합니다.) 우리는 MySQL에 정렬하고자하는 값을 포함하는 컬럼 (mycol)을 가져 오도록 말하고 있습니다. 1,3,2,4,2,1,4,3,5 그리고 우리는 이들에게 오름차순으로 순서를 정하도록 MySQL에게 명령합니다 : 1,1,2,2,3,3,4,4,5.

"트릭"은 MySQL 사용자 변수를 사용하므로 현재 행의 mycol 값과 이전 행의 mycol 값을 비교할 수 있으며,이를 사용하여 오름차순 시퀀스 값을 각 개별 값에 1..n.

결과 집합으로, 우리는 MySQL에게 그 할당 된 순서 값을 먼저 순서대로 정렬 한 다음 mycol의 값으로 정렬하도록 말할 수 있습니다.


각 행에 대한 고유 ID가 존재한다면, 상관 부질

SELECT r.mycol 
    FROM mytable r 
    ORDER 
    BY (SELECT COUNT(1) 
      FROM mytable q 
      WHERE q.mycol = r.mycol 
      AND q.id <= r.id 
     ) 
     , r.mycol 
(이 방법은 큰 세트에도 수행하는 것이 매우 가능성이 있음) 상응하는 결과를 얻기 위해 사용될 수있다

테스트 케이스를위한 설정은 다음과 같습니다.

CREATE TABLE mytable (id INT, mycol INT); 
INSERT INTO mytable (id, mycol) VALUES 
(1,1),(2,3),(3,2),(4,4),(5,2),(6,1),(7,4),(8,3),(9,5); 
+0

게시 해 주셔서 감사합니다. 나는 mysql 사용자 변수로 전략을 사용하여 솔루션을 구현했다. – user1074861

0

는이

ORDER BY column ASC 
+2

그건 간단하게 만들거야 1,1,2,2,3,3,4,4,5 – user1074861

0

이의는 PK가 고유 한 정수입니다 척하자 어떤 순서로 두 시간이 없다. ... 큰 세트

CREATE TABLE seq(id INT NOT NULL PRIMARY KEY,val INT); 

INSERT INTO seq VALUES (8,1),(4,2),(1,3),(2,4),(7,0),(6,1),(3,2),(5,5); 

SELECT * FROM seq ORDER BY val; 
+----+------+ 
| id | val | 
+----+------+ 
| 7 | 0 | 
| 6 | 1 | 
| 8 | 1 | 
| 3 | 2 | 
| 4 | 2 | 
| 1 | 3 | 
| 2 | 4 | 
| 5 | 5 | 
+----+------+ 

SELECT x.* 
    , COUNT(*) rank 
    FROM seq x 
    JOIN seq y 
    ON y.val = x.val 
    AND y.id <= x.id 
GROUP 
    BY id 
ORDER 
    BY rank 
    , val; 
+----+------+------+ 
| id | val | rank | 
+----+------+------+ 
| 7 | 0 | 1 | 
| 6 | 1 | 1 | 
| 3 | 2 | 1 | 
| 1 | 3 | 1 | 
| 2 | 4 | 1 | 
| 5 | 5 | 1 | 
| 8 | 1 | 2 | 
| 4 | 2 | 2 | 
+----+------+------+ 
+0

잘 했어! 이것이 제가 찾고 있던 것입니다. – user1074861

관련 문제