[SQL] MySQL의 "IN"쿼리의 질서를 유지
SQLMySQL의 "IN"쿼리의 질서를 유지
나는 다음과 같은 테이블이
DROP TABLE IF EXISTS `test`.`foo`;
CREATE TABLE `test`.`foo` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
그 때 나는 차 키를 기반으로 레코드를 얻으려고
SELECT * FROM foo f where f.id IN (2, 3, 1);
그때 나는 다음과 같은 결과를 얻을 수
+----+--------+
| id | name |
+----+--------+
| 1 | first |
| 2 | second |
| 3 | third |
+----+--------+
3 rows in set (0.00 sec)
사람이 볼 수 있듯이, 결과는 ID로 정렬됩니다. 내가 달성하기 위해 노력하고있어 결과가 내가 쿼리에 제공하고있어 순서대로 정렬 얻는 것입니다. 그것은 반환해야이 예를 감안할 때
+----+--------+
| id | name |
+----+--------+
| 2 | second |
| 3 | third |
| 1 | first |
+----+--------+
3 rows in set (0.00 sec)
해결법
-
==============================
1.다른 대답은 언급대로 : 당신이 게시 된 쿼리는 당신이 당신의 결과, 당신이 얻을 싶은 단지 결과를 싶습니다 주문 것에 대해 아무런 상관이 없습니다.
다른 대답은 언급대로 : 당신이 게시 된 쿼리는 당신이 당신의 결과, 당신이 얻을 싶은 단지 결과를 싶습니다 주문 것에 대해 아무런 상관이 없습니다.
결과를 주문하려면, 내가) (ORDER BY 필드를 사용합니다 :
SELECT * FROM foo f where f.id IN (2, 3, 1) ORDER BY FIELD(f.id, 2, 3, 1);
필드로 인수 목록은 가변 길이 될 수 있습니다.
-
==============================
2.IN () 조건의 값은 한 세트로 간주하고, SQL 쿼리에 의해 반환되는 결과는 집합의 순서 추론에 자동으로 방법이 없습니다.
IN () 조건의 값은 한 세트로 간주하고, SQL 쿼리에 의해 반환되는 결과는 집합의 순서 추론에 자동으로 방법이 없습니다.
일반적으로, 모든 SQL 쿼리의 순서는 ORDER BY 절과 순서를 지정하지 않으면 임의이다.
당신은 당신이 원하는 것을 할 수있는 MySQL의 기능 FIND_IN_SET ()를 사용할 수 있습니다 :
SELECT * FROM foo f where f.id IN (2, 3, 1) ORDER BY FIND_IN_SET(f.id, '2,3,1');
FIND_IN_SET의리스트 인수가 () IN의 인수와 같은 가변 길이리스트는 아닙니다 (). 그것은 문자열 리터럴 또는 설정해야합니다.
성능에 대한 질문 재 : 나는 FIND_IN_SET ()와 FIELD ()에 StackOverflow의 데이터의 내 사본에 대한 방법을 모두 시도 그래서 나도 궁금 :
VoteTypeId에 아무런 인덱스 :
SELECT * FROM Votes ORDER BY FIND_IN_SET(VoteTypeId, '13,1,12,2,11,3,10,4,9,5,8,6,7'); 3618992 rows in set (31.26 sec) 3618992 rows in set (29.67 sec) 3618992 rows in set (28.52 sec) SELECT * FROM Votes ORDER BY FIELD(VoteTypeId, 13,1,12,2,11,3,10,4,9,5,8,6,7); 3618992 rows in set (37.30 sec) 3618992 rows in set (49.65 sec) 3618992 rows in set (41.69 sec)
VoteTypeId에 인덱스로 :
SELECT * FROM Votes ORDER BY FIND_IN_SET(VoteTypeId, '13,1,12,2,11,3,10,4,9,5,8,6,7'); 3618992 rows in set (14.71 sec) 3618992 rows in set (14.81 sec) 3618992 rows in set (25.80 sec) SELECT * FROM Votes ORDER BY FIELD(VoteTypeId, 13,1,12,2,11,3,10,4,9,5,8,6,7); 3618992 rows in set (19.03 sec) 3618992 rows in set (14.59 sec) 3618992 rows in set (14.43 sec)
결론 : 제한된 테스트와 함께, 더 큰 장점 중 하나 방법이 없습니다.
from https://stackoverflow.com/questions/1631723/maintaining-order-in-mysql-in-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 쿼리 실행 엔티티 프레임 워크에서 익명 유형 결과 (0) | 2020.04.24 |
---|---|
[SQL] PostgreSQL의 버전 - 만 SQL을 사용하여 반환 사전 UPDATE 열 값 (0) | 2020.04.24 |
[SQL] 지난 몇 일 SELECT MYSQL? (0) | 2020.04.24 |
[SQL] 방법은 하나 개 이상의 결과 하위 쿼리를 사용하여 테이블에 값을 삽입 할 수 있습니까? (0) | 2020.04.24 |
[SQL] 왜 LIKE 필터에 밑줄 문자를 사용하여 저 모두에게 결과를 제공합니까? (0) | 2020.04.24 |