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

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

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

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

friends
-------

id    name

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

어떻게 할 수 있습니까?

Mysql 5.1.x 사용.

감사!



답변

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


답변

이 시도:

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


답변

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

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

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

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


답변

예를 들어 다음과 같은 경우 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’열을 정렬 한 다음 쉬다.


답변

이 문제를 해결하려면 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를 끝냅니다.


답변

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를 제외합니다.


답변

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

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