2009-02-05 5 views
156

어떻게 MySQL 테이블을 두 개의 열로 정렬합니까?PHP 2 개 열로 MySQL 데이터베이스 정렬

내가 원했던 기사는 가장 높은 평점 순으로 정렬되고, 가장 최근 날짜 순으로 정렬됩니다.

ORDER BY article_rating, article_time DESC 

: 예를 들어,이

 
50 | This article rocks   | Feb 4, 2009 
35 | This article is pretty good | Feb 1, 2009 
5 | This Article isn't so hot | Jan 25, 2009 

내가 사용 관련 SQL은 (왼쪽 #을 누른 후 기사 제목, 다음 기사 날짜 등급입니다) 샘플 출력 될 것이다 둘 중 하나만 정렬 할 수 있지만 둘 다 정렬 할 수는 없습니다.

답변

340

기본 정렬은 오름차순입니다, 당신은 모두 당신의 명령에 키워드 DESC를 추가해야 끝에

ORDER BY article_rating DESC, article_time DESC 
+0

이상한. 두 개의 열이있을 때 이름과 합계가 이름과 DESC 순으로 알파벳순으로 정렬하려면 총칭이 아닌 이름순으로 정렬되어야합니다. – Eugene

+0

그럴 수 있다는 것을 알지 못했습니다! Exxelent! :) – teecee

+0

숫자 필드에 아무 이유없이 (-1) * field1, field2 ... 해킹했습니다. ... 감사합니다. –

7
ORDER BY article_rating ASC , article_time DESC 

DESC가 내려 모두 열을 기준으로 정렬됩니다. 당신은 당신이 같은 등급이 개 기사가있는 경우에만 article_time을 기준으로 정렬됩니다 그렇지 않으면

20
ORDER BY article_rating, article_time DESC 

원하는 경우 ASC를 지정해야합니다. 당신의보기에서 볼 수있는 모든 것에서 이것은 정확히 일어납니다.

↓ 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. 
6

이 아마 두 개의 컬럼으로 테이블을 정렬하는 방법을 찾고 사람을 도움이되지만, 병렬 방식으로. 즉, 집계 정렬 기능을 사용하여 두 가지 유형을 결합해야합니다. 예를 들어 전문 검색을 사용하여 기사를 검색 할 때와 기사 게시 날짜와 관련하여 매우 유용합니다.

이것은 예제 일 뿐이지 만 아이디어를 잡으면 많은 집계 함수를 사용할 수 있습니다. 열을 추가하여 1 초 이상을 선호 할 수도 있습니다. 내 기능은 두 가지 모두에서 극단을 취하므로 가장 가치있는 행이 맨 위에 있습니다.

죄송합니다.이 작업을 수행하는 간단한 해결책이 있지만 아직 찾지 못했습니다.

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 
+18

오 세상에 왜 그런 간단한 질문에 그런 코드를 게시합니까? – Andy

2

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

ORDER BY article_rating DESC, article_time DESC 
관련 문제