2014-11-23 4 views
3

내 MySQL 데이터베이스에는 4 가지 범주로 저장된 여러 제품이 포함되어 있습니다. 모든 정보는 동일한 표에 있습니다.MySQL의 특정 ORDER BY 절

id - name - description - price - category 

이 순서대로 나열하려고합니다. 가능하다면 MySQL 요청으로 만이 작업을 수행합니다.

Cat1 : product-name-with-lower-price1 
Cat2 : product-name-with-lower-price1 
Cat3 : product-name-with-lower-price1 
Cat4 : product-name-with-lower-price1 

Cat1 : product-name-with-lower-price2 
Cat2 : product-name-with-lower-price2 
Cat3 : product-name-with-lower-price2 
Cat4 : product-name-with-lower-price2 

Cat1 : product-name-with-lower-price3 
Cat2 : product-name-with-lower-price3 
Cat3 : product-name-with-lower-price3 
Cat4 : product-name-with-lower-price3 

등 ...

은 내가 노력 모든 것을 작동하지 않기 때문에 내가 테스트 모든 소스 코드를 제공하지 유감입니다. 나는 MySQL Order By 절을 사용한다고 생각하지만 어떻게해야할지 모르겠다.

많은 들으

편집 :

제품은 낮은 가격으로 표시됩니다. 각 고양이의 낮은 가격을 추출한 후 가격 ASC별로 주문합니다. 그리고 가격 ASC 각 고양이와 순서의 다음 낮은 가격을 추출 등등 ...

은 그래서 같이 수 :

Cars : Aygo 8000$ 
Moto : Suzuki 8200$ 
Bus : Renault 8700$ 
Truck : Peugeot 9000$ 

Cars : Toyota 9300$ 
Bus : Renault 9400$ 
Truck : DMG 9600$ 
Moto : Harley 14000$ 


Bus : Mercedes 12000$ 
Moto : BMW : 18000$ 
Cars : Mercedes 11000$ 
Truck : Renault 10000$ 
+0

당신이 지금까지 테스트 한 내용을 SQL 문을 우리에게 보여줍니다. – pbaldauf

+0

에는 네 가지 범주 만 있습니까? 이상 ? –

+0

@Begueradj 현재는 단 4입니다.하지만 앞으로 조언 해 드리겠습니다. – MrSo

답변

1

이것은 Raina의 접근 방식을 개선하기위한 것입니다. 이 접근 방식에는 두 가지 문제가 있습니다. 첫 번째는 서브 쿼리에 order by입니다. 하위 쿼리의 순서가 동일한 순서로 결과를 생성한다는 보장은 없습니다 (일반적으로 MySQL에서는 실제로 작동하지만 사용자는 동작에 의존해서는 안됩니다). 두 번째 변수는 select에 여러 변수가 지정되어 있습니다. MySQL은 할당 순서를 보장하지 않습니다.

쓰기이의 더 안전한 방법은 다음과 같습니다

SELECT id, price, category 
FROM (SELECT (@rownum := IF(@cat = t.category, @rownum + 1, 
          IF(@cat := t.category, 1, 1) 
          ) 
      )criteria, 
      t.* 
     FROM Table1 t 
     ORDER BY category, price 
    ) tt 
ORDER BY tt.criteria, tt.category; 
+0

Upvoted,이 메모를 가져 주셔서 감사합니다. 이 접근법이 네가 언급 한 첫 번째 문제 (중첩 된 쿼리에서 순서대로)와 어떻게 다른지 이해할 수는 없지만 실제로는 두 번째 과제 (할당 순서)와 관련하여 더 안정적 인 것으로 보입니다. 전반적으로이 문제를 다시 조사하는 것이 좋을 것이라고 생각합니다. [주문에 관한 가장 포괄적 인 기사] (http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/)는 약간 오래된 것 같습니다. – raina77ow

+0

@ raina77ow. . . 하위 쿼리의 순서 지정에 대한 제한은 ANSI 표준 제한 사항이며 제한 조항이없는 하위 쿼리에서 'order by'에 의존 할 수 있다고 명시하는 MySQL 설명서의 참조를 아직 찾지 못했습니다. 이것은 병렬 데이터베이스 (예 : MySQL에서 파생 된) 인 MariaDB에서 큰 문제입니다. 두 번째 문제는 실제로 상황에 따라 변수가 실제로 다른 순서로 평가됩니다. –

+0

아, 이제 알겠습니다 (또는 그렇게 생각합니다) :'SELECT'의 표현식은 행이 정렬 된 후에 적용되므로 중첩 된 쿼리가 실제로 필요하지 않습니다. 다시 한번 감사드립니다.) – raina77ow

2

한 가지 가능한 방법 :

SELECT id, price, category 
    FROM (
     SELECT @rownum := 
     (CASE 
      WHEN @cat = t.category THEN @rownum + 1 
      ELSE (@cat := t.category) IS NOT NULL 
      END) criteria, 
     t.* 
     FROM Table1 t 
     ORDER BY category, price 
) tt 
ORDER BY tt.criteria, 
    FIELD(tt.category, 'Cat1', 'Cat2', 'Cat3'); 

SQL Fiddle . FIELD 함수는 카테고리의 특정 순서를 설정하는 데 사용됩니다. 알파벳순으로 정렬 된 것이 좋으면 ORDER BY tt.criteria, tt.category으로 바꿀 수 있습니다.

+0

Thx for 이 접근법, 나는 그런 트릭이 필요하다는 것을 확신했다. 그러나 이것은 효과가없는 것 같습니다.이 순서 첫째로 종류에 의하여, 가격에 의해 과세 된 종류에있는 모든 제품을 목록으로 만들고 다음 종류에 가고 모든 제품 등등을 목록으로 만든다. 나가 예상하는주기는 존중되지 않는다 : (당신은 당신의 피들에서 그것을 볼 수있다 : 고양이 A. 나는 접근 방식을 사용하여이 작업을 시도하고 있습니다 ... – MrSo

+0

_stroke_The 2 첫 번째 제품은 고양이 형태입니다 A._stroke_ 죄송합니다 잘못된 장소를 찾고 있었는데 필요한 경우 새 코드를 테스트하고 바이올린을하십시오 Thx @ raina77ow – MrSo

+0

YES! Charm과 같이 작동합니다. 감사합니다. @ raina77ow가 최고입니다. – MrSo