특정 ID 값에 따른 MySQL 순서


96

다음과 같이 미리 정의 된 열 값 (ID) 집합을 사용하여 mysql에서 "order by"로 정렬 할 수 있습니까? order by (ID = 1,5,4,3) 그래서 1, 5, 4, 3 레코드를 얻을 수 있습니다. 주문?

업데이트 : mysql 남용에 대해 ;-) 왜 이것이 필요한지 설명해야합니다 ...

5 분마다 무작위로 레코드 변경 정렬을 원합니다. 다른 임의의 정렬 순서를 적용하기 위해 업데이트 테이블을 수행하는 cron 작업이 있습니다. 한 가지 문제가 있습니다! 쪽수 매기기. 내 페이지를 방문하는 방문자가 있고 그에게 처음 20 개의 결과를 제공합니다. 그는 6 분을 기다렸다가 2 페이지로 이동하고 정렬 순서가 모두 변경되었으므로 잘못된 결과를 얻게됩니다.

그래서 나는 그가 내 사이트에 오면 모든 ID를 세션에 넣고 그가 2 페이지에있을 때 정렬이 모두 변경 되더라도 올바른 레코드를 얻는다고 생각했습니다.

이 작업을 수행하는 다른 방법이 있습니까?


mysql이 특별한 순서없이 주문할 수있는 방법이 있는지 묻고 있습니까?
stefgosselin 2011

1
데이터 모델이 고장 중 / 불완전 (것 같은데 어디 에서이 순서 오는가?) 또는 대안 당신은 MySQL을 학대하고 있습니다.
derobert

답변:


204

ORDER BY 및 FIELD 기능을 사용할 수 있습니다. http://lists.mysql.com/mysql/209784 참조

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

그것은 사용하는 필드 () 문서에 따르면 "str을 찾을 수없는 경우 STR1, STR2, STR3 ... 목록입니다. 반환 0 반환 STR의 인덱스 (위치)"기능을. 따라서 실제로 주어진 집합에있는 필드 값의 인덱스 인이 함수의 반환 값으로 결과 집합을 정렬합니다.


WHERE ID IN (1,5,4,3)
TV-C-15

1
None 값과 함께 어떻게 사용합니까?
Nono London

30

이를 위해 사용할 수 있어야합니다 CASE.

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

ORDER BY 에 대한 mysql의 공식 문서에 누군가 FIELD다음과 같이이 문제에 사용할 수 있다고 게시했습니다 .

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

이것은 이론적으로 작동해야하는 테스트되지 않은 코드입니다.


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

예를 들어 10 개의 레지스트리가있는 경우 이렇게하면 ID 1, 5, 4 및 3이 먼저 표시되고 다른 레지스트리가 다음에 표시됩니다.

일반 전시 12 34 5678 9 10

이런 식으로

8 5 4 3 12 6 7 9 10


Ok 조언 감사합니다
Bruno Mangini Alves

6

이것을 해결하는 다른 방법이 있습니다. 다음과 같이 별도의 테이블을 추가하십시오.

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

이 테이블은 이제 자신의 주문 메커니즘을 정의하는 데 사용됩니다.

거기에 값을 추가하십시오.

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

...이 새 테이블을 결합하는 동안 SQL 문을 수정합니다.

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

이 솔루션은 다른 솔루션보다 약간 더 복잡하지만이를 사용하면 SELECT주문 기준이 변경 될 때마다 진술 을 변경할 필요가 없습니다 . 주문 테이블의 데이터 만 변경하면됩니다.


1

결과에서 먼저 단일 ID를 주문해야하는 경우 ID를 사용하십시오.

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

여러 ID 시퀀스로 시작해야하는 경우 IN문에서 사용하는 것과 유사한 컬렉션을 지정합니다 .

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

좀 더 설명을 추가
매튜스 써니

당신은 하나의 id 인에 의해 순서를 사용하려면 다음 1 개 차 쿼리를 사용하고 여러 ID에 대한하려면 다음 두번째 쿼리를 사용하여
인 Rajesh Kharatmol

0
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
더 설명해 주시겠습니까? 이것은 허용 대답과 유사하지만, 나는 그렇게 생각하지 않는 ASC OR DESC올바른 구문입니다
니코 하세

@NicoHaase ASC와 DESC의 차이점은 asc를 사용하면 필드 기능에서 사용하는 ID가 끝나고 DESC를 사용하면 필드 기능의 ID가 먼저옵니다.
히샴은 샤 히드

당신은 요구 사항에 질의 한 accroding 중 하나와 하나 ASC 또는 DESC를 사용할 수 있습니다 @NicoHaase
히샴은 샤 히드

따라서 하나의 쿼리에서 둘 다 사용할 수는 없습니다. 니코는 당신이 당신의 대답을 구문 적으로 옳았다 고 제안한 것 같아요. 나는 그가 ASD와 DESC가 실제로 의미하는 바에 대해 잘 알고 있다고 확신합니다. :)
RiggsFolly

0

결과에서 마지막으로 단일 ID를 주문하려면 케이스 별 주문을 사용하십시오. (예 : 마지막에 "기타"옵션을 원하고 모든 도시 목록을 알파벳순으로 표시합니다.)

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

예를 들어 5 개의 도시가있는 경우 드롭 다운에서 마지막에 "기타"옵션을 표시하여 알파벳순으로 도시를 표시하고 싶은 경우이 쿼리를 사용할 수 있습니다. 다른 예제는 두 번째 id (id : 2)에서 내 테이블에 표시되므로 위의 쿼리에서 "when id = 2"를 사용하고 있습니다.

DB 테이블에 기록 :

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

내 출력 :

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
코드에 설명을 추가하면 답변이 더 명확하고 이해하기 쉬워집니다. stackoverflow.com/help/how-to-answer를 읽으십시오.
32cupo

하나의 ID에 대해서만 order by를 사용하려는 경우 (예 : 마지막에 "기타"옵션을 원하고 모든 도시 목록이 알파벳 순서로 표시됩니다.)이 쿼리를 사용할 수 있습니다. 그것은 나를 위해 일하고 있습니다.
Preeti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.