아래 표가 있다고 가정 해 봅시다.
모든 친구를 얻고 싶지만 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의 대답을 진심으로 추천합니다.
id=5 desc열이 null을 포함 할 때 !=5null을 먼저
예를 들어 다음과 같은 경우 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;
이것은보다 낫다
이것은 코드 중복이 있기 때문에 약간 추악하지만 트릭을 수행합니다.
select .... where id = 5
union
select .... where not id = 5
order by하면 전체 공용체가 정렬됩니다.