mysql SQL : 특정 항목을 먼저 지정한 다음 나머지 항목을 정렬합니다.


80

아래 표가 있다고 가정 해 봅시다.

모든 친구를 얻고 싶지만 ID 5가 목록의 첫 번째 항목이되기를 원합니다. 나머지 항목을받는 순서는 신경 쓰지 않습니다.

원하는 쿼리 결과는 다음과 같습니다.

friends
-------

id    name

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

어떻게 할 수 있습니까?

Mysql 5.1.x 사용.

감사!

답변:


148
select id,name 
from friends 
order by id=5 desc

(나머지 순서는 신경 쓰지 않는다는 점을 감안할 때, 그렇지 않으면 예를 들어 rest by id asc )

select id,name 
from friends 
order by id=5 desc, id asc

10
@ maxx777이 질문은 현재 Oracle 소유인 MySQL 태그입니다. Microsoft SQL Server에서와 같이 "sql-server"가 아닙니다.
RichardTheKiwi

1
대부분의 쿼리는 모든 DBMS에서 작동한다고 생각합니다. 누군가이 쿼리가 특정 DBMS에서 작동하지 않는다고 말하면 일반적으로 특정 DBMS에 대한 솔루션을 요청하는 것입니다.
maxx777

8
@ maxx777 그래서 우리는 태그와 별도의 질문이 있습니다. 그것은 그의 MySQL 문제에 대한 질문자를 위해 일했습니다. SQL Server 2005를 원하면 다른 답변이 있습니다.이 답변이 작동하도록 광고되지 않은 것에 대해 작동하지 않는다는 명백한 언급을 할 필요가 없습니다.
RichardTheKiwi

48

이 시도:

select id,name 
from friends 
order by case when id=5 then -1 else id end

하나 이상 있으면 다음을 수행 할 수 있습니다.

select id,name 
from friends 
order by case when id in (5,15,25) then -1 else id end,id

4

지금은 MySQL에 액세스하여 테스트 할 수 없으므로 역전 될 수 있습니다.하지만 Booleans도 정렬하고 여러 정렬 필드를 가질 수 있다는 사실을 사용할 수 있습니다.

SELECT ... ORDER BY id != 5, id

(당신은 작성해야 할 수도 있습니다. id = 5TRUE가 FALSE 전후에 정렬되는지 기억할 수 없습니다.)

편집 : 오, 나는 당신이 나머지 순서에 신경 쓰지 않는다는 것을 읽었습니다.이 경우 @Richard의 대답을 진심으로 추천합니다.


3
id=5 desc열이 null을 포함 할 때 !=5null을 먼저
넣기

2

예를 들어 다음과 같은 경우 UNION 쿼리에 대해 동일한 작업을 수행하려는 경우 :

select id,name 
from friends 
UNION
select id,name 
from friends 
order by id=5 desc

... PostgreSQL에서 예외가 발생합니다.

결과 열 이름 만 사용할 수 있으며 표현식이나 함수는 사용할 수 없습니다. 힌트 : 모든 SELECT에 식 / 함수를 추가하거나 UNION을 from 절로 이동

이 문제를 해결하려면 다음을 사용합니다.

select id,name, (id=5) AS is_five
from friends 
UNION
select id,name, (id=5) AS is_five
from friends 
order by is_five DESC, id DESC

표현식 (id = 5)은 열 값이 예상 값 (5)과 같은지 여부에 따라 't'OR 'f'를 반환하므로 정렬 기준은 먼저 't'열을 정렬 한 다음 쉬다.


2

이 문제를 해결하려면 MySQL의 ORDER BY FIELD 절을 사용해야합니다. 이에 대한 대답은 받아 들여졌지만 여기에 더 나은 해결책이 있습니다.

select 1 id, 'Zeta' order_col union all
select 2 id, 'Alpha' order_col union all
select 3 id, 'Gamma' order_col union all
select 4 id, 'Phi' order_col union all
select 5 id, 'Delta' order_col union all
select 6 id, 'Delta' order_col union all
select 7 id, 'Alpha' order_col union all
select 8 id, 'Gamma' order_col union all
select 9 id, 'Zeta' order_col union all
select 10 id, 'Phi' order_col 
order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;

이것은보다 낫다

  • id = something, id asc로 주문
  • 경우에 따라 주문한 다음 1 일 때 something_else를 누른 다음 2가 desc를 끝냅니다.

1
왜 이것이 반대 투표인지 확실하지 않습니다. 필드 별 순서가 더 나은 이유를 알고 싶지만 대답은 흥미 롭습니다.
John

@John-대부분 가독성이 쉽기 때문에 더 좋습니다. 또한 MySQL이 즉시 제공하는 솔루션입니다. 열에서 많은 값의 순서를 지정해야 할 때 이것이 더 의미가 있다고 생각합니다.
MontyPython

1
나는 사람들이 당신이 "전체 연합"과 함께 ORDER BY 필드에 대한 질문에 대한 해결책을 제공했다는 것을 단순히 이해하지 못했다고 생각합니다. 따라서 반대표는 무능력 때문입니다.
John

@Strawberry 의 게시물 -meta.stackoverflow.com/questions/333952/… 를 염두에두고 모든 답변을 확인합니다 .
MontyPython 2018

2

field()MySQL에서 사용할 수 있습니다 .

select id,name from friends order by field(id,5,id)

field ()의 첫 번째 매개 변수는 정렬하려는 필드를 의미하고 나머지는 정렬됩니다.

따라서 5가 먼저 정렬되고 나머지는 id (5 제외)에서 정렬됩니다. 당신은 좋아할 수 있습니다field(id,5,1,3,id) 는 5,1,3 전면에 있어야합니다.

5는 마지막으로 정렬하도록 선택할 수 있습니다 field(id,id,5). 두 번째 ID도 5를 제외합니다.


-7

이것은 코드 중복이 있기 때문에 약간 추악하지만 트릭을 수행합니다.

select .... where id = 5 
union
select .... where not id = 5

2
유니온 후에 행이 정렬 된 상태로 유지된다면 그것은 단지 우연입니다. 를 지정 order by하면 전체 공용체가 정렬됩니다.
Andomar 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.