두 열로 MySQL 테이블 주문


228

MySQL 테이블을 두 열로 어떻게 정렬합니까?

내가 원하는 것은 먼저 가장 높은 등급으로 정렬 된 다음 가장 최근 날짜로 정렬 된 기사입니다. 예를 들어, 이것은 샘플 출력입니다 (왼쪽 #는 평가, 기사 제목, 기사 날짜).

50 | 이 기사는 바위 | 2009 년 2 월 4 일
35 | 이 기사는 꽤 좋다 | 2009 년 2 월 1 일
5 | 이 기사는 뜨겁지 않다 | 2009 년 1 월 25 일

사용중인 관련 SQL은 다음과 같습니다.

ORDER BY article_rating, article_time DESC

둘 중 하나만 정렬 할 수 있지만 둘 다 정렬 할 수는 없습니다.

답변:


480

기본 정렬이 오름차순이므로 두 주문 모두에 키워드 DESC를 추가해야합니다.

ORDER BY article_rating DESC, article_time DESC

이상한. 이름과 합계의 두 열이 있고 이름과 DESC를 알파벳순으로 정렬하려면 이름별로 정렬 된 것이 아니라 이름순으로 정렬 된 것만 볼 수 있습니다.
Eugene

나는 숫자 필드에 아무런 이유없이 (-1) * field1, field2로 해킹하고 있습니다 ... 감사합니다.
Asad Hasan

hahaha .... 좋은 쿼리는 아닙니다. 시도하면 "빈"값 범주를 다시 정렬 할 수 없기 때문입니다 ... 2009 년에 시도해보십시오. .. 그러나 2015 년에는 제대로 작동하지 않습니다;), 올바른 것은 "3 "또는"2 "하위 쿼리
대인 수수

이 경우에는 해당 쿼리가 작동하지 않습니다.이 경우 Tn은 도시 선택 고유 도시, 국가 별 고객 주문에서 국가 별, 도시 별으로 정렬 할 수 없습니다.
Pra_A

4
왜 이것이 답변으로 확인되었는지는 모르겠습니다. 첫 번째 열을 기준으로 정렬 한 다음 두 번째 열을 기준으로 정렬하지만 동시에 둘 다 정렬하지는 않습니다.
aidonsnous

34
ORDER BY article_rating, article_time DESC

평점이 동일한 기사가 두 개있는 경우에만 article_time을 기준으로 정렬합니다. 귀하의 예에서 볼 수있는 모든 것에서 이것이 정확히 일어난 것입니다.

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 4, 2009    3.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

그러나 다음을 고려하십시오.

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 2, 2009    3.
1.  50 | This article rocks, too     | Feb 4, 2009    4.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

이 답변은 저에게 도움이되었습니다. 감사합니다 @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESC마지막에는 두 열을 내림차순으로 정렬합니다. ASC그렇지 않으면 원하는지 지정 해야합니다.


8

이것은 테이블을 두 개의 열로 정렬하는 방법을 찾고 있지만 병렬로 찾는 사람에게 도움이 될 수 있습니다. 이는 집계 정렬 기능을 사용하여 두 가지 정렬을 결합하는 것을 의미합니다. 예를 들어 전체 텍스트 검색을 사용하여 기사를 검색하거나 기사 게시 날짜와 관련하여 매우 유용합니다.

이것은 단지 예일 뿐이지 만, 아이디어를 잡으면 사용할 많은 집계 함수를 찾을 수 있습니다. 열에 가중치를 부여하여 초 당 하나를 선호 할 수도 있습니다. 내 기능은 두 가지 유형에서 모두 극단을 차지하므로 가장 가치있는 행이 맨 위에 있습니다.

이 작업을 수행 할 수있는 더 간단한 솔루션이 있지만 죄송합니다.

SELECT
 `id`,
 `text`,
 `date`
 FROM
   (
   SELECT
     k.`id`,
     k.`text`,
     k.`date`,
     k.`match_order_id`,
     @row := @row + 1 as `date_order_id`
     FROM
     (
       SELECT
         t.`id`,
         t.`text`,
         t.`date`,
         @row := @row + 1 as `match_order_id`
         FROM
         (
           SELECT
             `art_id` AS `id`,
             `text`   AS `text`,
             `date`   AS `date`,
             MATCH (`text`) AGAINST (:string) AS `match`
             FROM int_art_fulltext
             WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE)
             LIMIT 0,101
         ) t,
         (
           SELECT @row := 0
         ) r
         ORDER BY `match` DESC
     ) k,
     (
       SELECT @row := 0
     ) l
     ORDER BY k.`date` DESC
   ) s
 ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC

34
오 마이 갓 왜 그런 간단한 질문에 대해 그러한 코드를 게시합니까?
벤 싱클레어

4

다음은 두 열에 따라 내림차순으로 데이터를 정렬합니다.

ORDER BY article_rating DESC, article_time DESC

3
4 년 후 수락 된 답변의 사본에이 많은 투표가 어떻게 접수됩니까?
Stack Underflow

때문에 explaination 될 수 있습니다 : P
리즈 완 하이더
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.