특정 필드 값을 기준으로 먼저 정렬


96

3 개의 열이있는 테이블이 있습니다.

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

우선 순위가 낮더라도 priority먼저 행을 사용하여 결과 집합을 정렬하고 싶습니다 name=core. 결과는 다음과 같아야합니다.

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8

답변:


167

도있다 MySQL의 FIELD기능 .

가능한 모든 값에 대해 완전한 정렬을 원하는 경우 :

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

"핵심"이 첫 번째이고 다른 값은 중요하지 않다는 점만 신경 쓰는 경우 :

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

먼저 "코어"를 기준으로 정렬하고 다른 필드를 일반 정렬 순서로 정렬하려는 경우 :

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

하지만 여기에는 몇 가지주의 사항이 있습니다.

첫째, 이것이 mysql 전용 기능이라고 확신합니다. 질문에는 mysql 태그가 지정되어 있지만 여러분은 결코 알 수 없습니다.

둘째, FIELD()작동 방식에 주의 하십시오. 값 의 1 기반 인덱스FIELD(priority, "core")반환합니다.의 경우 "core"가 값이면 1을 반환합니다. 필드 값이 목록에 없으면 0 을 반환 합니다 . 이것이 DESC가능한 모든 값을 지정하지 않는 한 필요한 이유 입니다.


5
약 5 년 후에 나는 이것이 더 깨끗하고 빠르기 때문에 받아 들여진 대답을 변경했습니다.
Omid

db2 동등?
Cybermonk

그것은 나를 위해 일했고, '우선 순위'열에 예 : '지구 코어', '새 보드'등과 같은 값이 포함되어있는 경우 처리 방법에 대해 한 가지 더 질문하고 싶습니다. 여기에 정확한 값이 포함되지 않은 열, 다음과 같이 작성할 수 있습니까? %핵심%?
Jayanth Suvarna

@JayanthSuvarna : MySQL FIELD () 문서를 보면 각 인수가 일종의 문자열이어야하므로이를 부분 문자열로 평가할 방법이 없다고 확신합니다. 도움이 될 수있는 문자열 조작 함수가있을 수 있지만 확실하지 않습니다.
Nerdmaster

고마워, 친구 당신은 내 하루를 만들었습니다.
BEingprabhU

93

일반적으로 할 수 있습니다.

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

특히 MySQL에서는 다음을 수행 할 수도 있습니다.

select * from your_table
order by name <> 'core',
         priority 

MySQL의 비교 결과는 0또는 이므로 해당 결과를 기준으로 1정렬 할 수 있습니다.


1
무엇을 수행 1하고 2여기 수단?
Niraj Chauhan

1
정렬 할 행이 약 3000 개 있습니다. 제 경우에는 stackoverflow.com/questions/958627/… 의 @ Ayman-Hourieh 솔루션이이 솔루션에 비해 절반의 시간이 걸립니다.
nightlyop 2014

@nightlyop : 좋은 사람. 단 한 가지 참고 : 더 빠른 솔루션은 MySQL에 따라 다릅니다.
juergen d

1그리고 2내가 데이터를 정렬하는 데 사용하는 단 2 수는 있습니다. 34또는 다른 것일 수 있습니다 .
juergen d

조항 %에있는 경우는 WHERE어떻습니까? 처럼 . . . WHERE name LIKE '%sth%' . . .? stackoverflow.com/questions/41303379/…
stack

6

특정 행에 우선 순위를 부여하는 한 가지 방법은 우선 순위에 많은 수를 추가하는 것입니다. 다음 CASE명령문으로 이를 수행 할 수 있습니다 .

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

데모 : http://www.sqlfiddle.com/#!2/753ee/1


5

이것은 Postgres 9 이상을 사용하는 나를 위해 작동합니다.

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

-1을 설명 하시겠습니까? 오류 + Postgres 버전?
Vojtech Vitek

3

한 가지 방법은 다음과 같습니다.

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

1
이것은 core행 의 순서를 잃지 않습니까?
mellamokb

1
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')

3
코드가 질문에 대한 답이 될 수 있지만 이에 대한 설명을 제공하는 것이 좋습니다.
Mehraban 2016

0

이 작업을 수행:

SELECT * FROM table ORDER BY column `name`+0 ASC

+0을 추가하면 다음을 의미합니다.

0, 10, 11, 2, 3, 4

됩니다 :

0, 2, 3, 4, 10, 11

이 기술은 문자열을 숫자로 변환하는 것입니다. OP의 질문을 다루지 않습니다. (그러나의 데이터 유형을 보지 않고 는 이것이 완전한 솔루션의 일부 여야priority 하는지 여부를 말할 수 없습니다 .)
Rick James

0

이것을 사용하십시오 :

SELECT * 
FROM tablename 
ORDER BY priority desc, FIELD(name, "core")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.