아래 표가 있다고 가정 해 봅시다.
모든 친구를 얻고 싶지만 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 = 5
TRUE가 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