2012-10-25 3 views
1

다른 테이블 순서 ASC 또는 DESC에서 쿼리 한 값을 기반으로합니다.CASE 순서에 따라 MySQL ORDER BY ASC 또는 DESC

그래서 이런 일이 :

SELECT * 
FROM table 
ORDER BY 
    CASE (SELECT sorting from table2 WHERE table2.id = ?) 
     WHEN 1 THEN table.date ASC END 
     WHEN 0 THEN table.date DESC END 
    END 

MySQL을 사용할 수 아무것도 같은가요?

내가 MS-SQL 서버에 대한 몇 가지 솔루션을 본 적이 : how to order 2 SQL Fields in asc and desc dynamically

편집을 : 난 그냥 고정 설명에 실수를 보았다.

답변

3
order by if((select sorting from table2 where table2.id = ?) = 1, 
    unix_timestamp(table.date), -unix_timestamp(table.date)) 

열이 숫자 인 경우 부정이 적용됩니다. 문자열 인 경우 높은 값을 낮은 값에 매핑하는 다른 함수를 찾을 수 있습니다.

+0

이것은 정확하지 않습니다. 다른 필드로 다른 테이블을 정렬하려고합니다. 질문에서 알 수 있듯이 필드 정렬 값은 0 또는 1이므로 정렬 또는 정렬하여 정렬하는 것은 쓸모가 없습니다 –

+0

이것은 실제로 작동합니다! 날짜를 변환 할 수 있습니다. 문제 없습니다. – Sam

+0

아니요, 필드의 값은 실제로 0 * 1이 아닌 * 날짜 * 값이므로이 방법이 유용 할 수 있습니다. 창조적 인 out-of-the-box 대안의 경우 +1. –

2

T-SQL 문은 제안 된 방식대로 조건부로 작성할 수 없습니다.

는 다음의 라인을 따라, 다음 구성된 문자열을 상대로 EXEC를 수행 VARCHAR에 검색어를 구성해야합니다

Declare @QueryString varchar(100) 
Declare @Direction int 

Select @direction = sorting 
    from table2 
where table2.id=? //from your original, not clear how you are providing it 

Set @QueryString = 'Select * from table order by yourField ' + case when @direction=1 then 'ASC' else 'DESC' end 

Exec (@QueryString) 

편집이 order_by 필드가 숫자 가정하면, 당신이 고용하는 트릭 하나 (비록 내가 "모범 사례"캠프에 빠질 지 확신 할 수 없지만) 필드의 순서 값을 -1로 곱하면 디폴트 순서를 반대로 바꿀 수있다. 예를 들어

Select @Direction = sorting 
    from table2 
where table2.id=? 

Select * 
    from table 
    order by (case when @direction=1 then -1 else 1 end) *yourField 
+0

t-sql을 사용하는 Microsoft는 아니지만 –

+0

Blast입니다. 그가 T-SQL 솔루션이 필요하다고 생각하기 위해 OP의 게시물을 잘못 읽었습니다. –

관련 문제