2013-03-21 2 views
0

빠른 연구를 내 문제에 대한 좋은 해결책이 될 것 같습니다.화합물 정렬

여기에 거래가 있습니다.

type|filter1|filter2|filter3|filter4|filter5 
3 |1  |0  |1  |1  |0 
... 

유형 - 수 값의 :

테이블을 상상할 1 또는 2 또는 3; 필터 1 - 5 - 부울 값.

제가 (위에서 아래로 하강) 필요한 분류 :

  1. TYPE = 3 필터 1 = 1;
  2. 타입 = 2, 필터 1 = 1;
  3. 타입 = 1, 필터 1 = 1;
  4. 타입 = 3, 필터 2 = 1;
  5. 타입 = 2, 필터 2 = 1;
  6. 타입 = 1, 필터 2 = 1;
  7. 타입 = 2, 필터 3 = 1 및 필터 4 = 1;
  8. 타입 = 3, 필터 3 = 1 및 필터 4 = 1;
  9. 타입 = 1, 필터 3 = 1 및 필터 4 = 1;
  10. 타입 = 2, 필터 3 = 1 및 필터 5 = 1;
  11. 타입 = 3, 필터 3 = 1 및 필터 5 = 1;
  12. 타입 = 1, 필터 3 = 1 및 필터 5 = 1;
  13. 유형은 (3,2), filter4 = 1;
  14. 타입 = 1, 필터 4 = 1;
  15. 유형 (3,2), 필터 5 = 1;
  16. 타입 = 1, 필터 5 = 1;

결과 상단에서 조건 번호 1을 충족하는 행이 표시됩니다. 다음 2 등입니다.

희망 사항은이 문제의 명확한 설명입니다.

감사합니다.

p.s. 현재 작업 솔루션은 IF의 무리를 가지고 있습니다. ...

SELECT 
IF(@type = 3 and @filter1 = 1, 16 
,IF(@type=2 and @filter1 = 1, 15 
... 
)) AS wieght, t.* 
FROM table t 
ORDER BY weight DESC 

하지만 그건는 최적화를 위해 우는 것 같다

+0

테이블을 정규화 할 수 있습니까? – Kermit

+0

@PolishPrince 글쎄, 그저 추상적 인 예입니다. 실제로는 유형 필드가 FIELD() func을 사용하여 계산됩니다. 필터 1 - 5도 해당 테이블에 직접 저장되지 않습니다. 여러 (5-7) 조인이 있습니다. –

답변

0
select concat(filter1, filter2, filter3, filter4, filter5) as mysort,t.* 
from t 
order by mysort, type desc 

MySQL의의 CONCAT 연산자는 0/1의 문자열을하지 자동 캐스트 부울 당신이 그들을 캐스팅해야합니다 않는 경우 내부 표현.

처음에는 (3,2)에서 유형에 대한 귀하의 조건을 놓쳤습니다. 원래 접근 방식과 비슷한 두 번째 수준 정렬을 사용할 수 있지만 형식 필드 만 포함하므로 덜 복잡해야합니다.

0

하나의 아이디어는 인덱싱되고 정렬에 사용될 수있는 가중치 필드를 설정하는 트리거를 테이블에 두는 것일 수 있습니다. 그런 다음 ORDER BY는 매우 효율적이며 가중치의 추함은 모든 SELECT 문과 독립적 인 트리거에 묻혀 있습니다.그 단점은 테이블을 많이 업데이트 한 다음 트리거를 사용하면 작업 속도가 느려질 수 있다는 것입니다.

+0

은 이전에 트리거로 작동하지 않았습니다. 그러나 느려지는 느낌이 있습니다. 실제로 'type'은 FIELD (...)로 계산됩니다. 필터 1 ~ 5 - 필드에서 변수로 설정됩니다. 그 테이블에 약 4-5 개의 조인이 추가됩니다. –

0

@Elroy 플린

이 쿼리가 작동하는 방법 확실하지 않다. 여기 있습니다.

select concat(filter1, filter2, filter3, filter4, filter5) as mysort, 
t.type, t.filter1, t.filter2, t.filter3, t.filter4, t.filter5 
from complex_sort t 
order by mysort, type desc 


mysort|type|filter1|filter2|filter3|filter4|filter5 
00110|1|0|0|1|1|0 
00110|1|0|0|1|1|0 
01000|3|0|1|0|0|0 
01000|2|0|1|0|0|0 
01000|2|0|1|0|0|0 
01000|1|0|1|0|0|0 
01001|2|0|1|0|0|1 
01001|2|0|1|0|0|1 
01001|1|0|1|0|0|1 
01010|3|0|1|0|1|0 
01110|3|0|1|1|1|0 
01111|3|0|1|1|1|1 
10000|3|1|0|0|0|0 
10000|3|1|0|0|0|0 
10000|2|1|0|0|0|0 
10001|3|1|0|0|0|1 
10010|2|1|0|0|1|0 
10100|1|1|0|1|0|0 
10110|1|1|0|1|1|0 
11000|2|1|1|0|0|0