특정 ID 값에 따른 MySQL 순서
mysql에서 미리 정의 된 열 값 (ID) 집합을 사용하여 "order by"로 정렬 할 수 있습니까? order by (ID = 1,5,4,3) 그래서 1, 5, 4, 3 기록 주문?
업데이트 : mysql 남용에 대해 ;-) 왜 이것이 필요한지 설명해야합니다 ...
5 분마다 무작위로 레코드 변경 정렬을 원합니다. 다른 임의의 정렬 순서를 적용하기 위해 업데이트 테이블을 수행하는 cron 작업이 있습니다. 한 가지 문제가 있습니다! 쪽수 매기기. 내 페이지를 방문하는 방문자가 있고 그에게 처음 20 개의 결과를 제공합니다. 그는 6 분을 기다렸다가 2 페이지로 이동하고 정렬 순서가 모두 변경 되었기 때문에 잘못된 결과를 얻게됩니다.
그래서 나는 그가 내 사이트에 오면 모든 ID를 세션에 넣고 그가 2 페이지에있을 때 정렬이 모두 변경 되더라도 올바른 레코드를 얻는다고 생각했습니다.
이 작업을 수행하는 다른 방법이 있습니까?
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의 인덱스 (위치)"기능을. 따라서 실제로 주어진 집합에있는 필드 값의 인덱스 인이 함수의 반환 값으로 결과 집합을 정렬합니다.
이를 위해 사용할 수 있어야합니다 CASE
.
ORDER BY CASE id
WHEN 1 THEN 1
WHEN 5 THEN 2
WHEN 4 THEN 3
WHEN 3 THEN 4
ELSE 5
END
ORDER BY 에 대한 mysql의 공식 문서 에서 누군가 FIELD
다음과 같이이 문제에 사용할 수 있다고 게시했습니다 .
SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
이것은 이론적으로 작동해야하는 테스트되지 않은 코드입니다.
이것을 해결하는 다른 방법이 있습니다. 다음과 같이 별도의 테이블을 추가하십시오.
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
주문 기준이 변경 될 때마다 진술 을 변경할 필요가 없습니다 . 주문 테이블의 데이터 만 변경하면됩니다.
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
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
결과에서 먼저 단일 ID를 주문해야하는 경우 ID를 사용하십시오.
select id,name
from products
order by case when id=5 then -1 else id end
If you need to start with a sequence of multiple ids, specify a collection, similar to what you would use with an IN
statement.
select id,name
from products
order by case when id in (30,20,10) then -1 else id end,id
참고URL : https://stackoverflow.com/questions/8322849/mysql-order-by-specific-id-values
'Nice programing' 카테고리의 다른 글
(iOS 7 출시 이후) PC / Mac에서 iTunes를 사용하지 않고 UDID를 얻을 수있는 방법이 있습니까? (0) | 2020.10.06 |
---|---|
Windows에서 npm을 어떻게 업데이트합니까? (0) | 2020.10.06 |
Django에서 db를 재설정하는 방법은 무엇입니까? (0) | 2020.10.06 |
뷰 컨트롤러에서 프로그래밍 방식으로 선을 어떻게 그리나요? (0) | 2020.10.06 |
Xcode 6에서 빌드 된 이전 프로젝트에서 XCTest / XCTest.h를 찾을 수 없습니다. (0) | 2020.10.06 |