2013-07-22 3 views
3

다음과 같은 구조의 제품 표가 있습니다.MYSQL 사례별로 주문

ProductID  ProductName  ProductType 
    1    Irrigation  1 
    2    Landscape  2 
    3    Sleeving  3 
    4    Planting  4 

지금 내가 잘 같은 작품 MYSQL FIELD 방법을 사용이를 위해 제품 유형 3,2,4,1 의 순서로 반환 행하기 위해 필요한이이 제대로 작동

Select * from product order by FIELD(producttype,3,2,4,1) 

,

제 문제는 제품 이름이 producttype 3에 대해 비어 있으면 비어 있지 않은 다음 productname을 가져야하므로 결과 순서는 2,4,1,3이어야합니다.

그래서 첫 번째 조건은 기록

Sleeving  3 
Landscape  2 
Planting  4 
Irrigation 1     

그러나 producttype 3 제품명 경우 것이 다음 순서는

Landscape  2 
Planting  4 
Irrigation 1 
       3 

그리고 producttype에 대한 추가 제품 이름으로 빈 필요가있다 제품 유형의 순서를 다음에있을 필요가있다 2가 비어 있으면 주문이 필요합니다.

Planting  4 
Irrigation 1 
       3 
       2 

그냥 첫 번째 기록을 골라야 해.

ORDER BY NULLIF(ProductName,'') IS NULL, FIELD(producttype,3,2,4,1) 

첫 번째 표현식이 반환됩니다 : 나는 희망

내가이이 규격을 만족 어떤 도움이

+0

시퀀스 순서가있는 열을 추가 할 수 있습니까? 예인 경우, where 절을 통해 빈 이름을 필터링하고 새 시퀀스 열로 정렬해야합니다 (1 –

답변

0

을 감상 할 수있다

내 지점을 취소합니다 ProductName이 "비어 있으면"1 (NULL 또는 길이가 0 인 st ring ') 그렇지 않으면 0을 반환합니다.

이렇게하면 비어 있지 않은 ProductName이 먼저 정렬되고 비어있는 ProductName이 먼저 정렬됩니다.

그런 다음 원래 표현으로 정렬됩니다.

두 개 이상의 (또는 모두) 빈 ProductName이있는 경우이 방법은 원래 지정된 순서를 유지합니다.

는 ("빈"에 대한 시험은 TRIM() 함수에를 이용, 예를 들면 다른 경우를 포함하도록 확장 될 수있다.


NULLIF(ProductName,'') IS NULL 

속기 인 표현을 동등한 SQL-92 호환 :

CASE WHEN ProductName = '' OR ProductName IS NULL THEN 1 ELSE 0 END 

(동일한 결과를 얻는 다른 방법이 있습니다.)

+0

이것은 실제로 완벽하게 작동합니다 ... –

1
Select * from product order by 
ISNULL(PRODUCTNAME),FIELD(producttype,3,2,4,1); 

fiddle

+0

으로 제한됨). – Starx

+0

http://www.sqlfiddle.com/#!2/fa18a/1 .. 바이올린을보십시오. '나중 사건'절에서 더 분명히하십시오. –

+0

이 작업은 정상적으로 작동합니다. –

0

작동해야합니다!

SELECT * FROM product ORDER BY FIELD(IF(ProductName is null,0,producttype),1,3,2,5) 
-1

당신은 제품 이름! = ''순서 필드에 의해 (producttype가, 3,2,4,1)

+0

이것은 행을 제외합니다. 나는 OP가 열을 정렬하고, 필터링하지 않기를 바랬다 고 생각한다. – spencer7593

0

이것은 매우 복잡한 쿼리입니다 제품에서이

선택 *를 시도 할 수 아무것도 될 수있는 다른 행의 다음 값을 식별해야하기 때문에 이 필요합니다. 뷰, 함수, 피벗 및 많은 조인이 가능하지만 행 수로 볼 때 결과가 좋지 않다고 생각합니다.

그러나, 직접 대답, 은 YES CASE와 BY 주문이 아닌 전체 쿼리입니다

Select * from product order by 
    CASE WHEN productname IS NULL then FIELD(producttype, 2, 4, 1, 3) 
    CASE WHEN productname IS NOT NULL THEN FIELD(producttype, 3, 2, 4, 1) 

다시 , 가능하며 당신의 행을 제한하는 경우 솔루션

아니다 이런 식으로 당신의 질문을 묶을 수 있습니다

Select * from product order by 
    CASE WHEN productname IS NULL then FIELD(producttype, 2, 4, 1, 3) 
    CASE WHEN (SELECT productname n FROM product WHERE producttype = '2') IS NULL THEN FIELD (4, 1, 3, 2) 

제가 알기로는 그는 제품 유형으로 '2'가 포함 된 행을 검색합니다. 다른 쿼리를 만들고이를 메인 쿼리로 피벗함으로써 이들을 알 수 있습니다.

다시 말하면이 아니라면 행 서버 측 처리가 매우 간단합니다.