반응형
MySQL "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)
다른 답변에서도 알 수 있듯이, 게시한 쿼리에는 원하는 결과 순서가 없습니다. 원하는 결과만 표시됩니다.
당신의 결과를 주문하려면ORDER BY FIELD()
:
SELECT * FROM foo f where f.id IN (2, 3, 1)
ORDER BY FIELD(f.id, 2, 3, 1);
인수 목록은 가변 길이일 수 있습니다.
의 값IN()
술어는 집합으로 간주되며 SQL 쿼리에 의해 반환되는 결과는 해당 집합에서 순서를 자동으로 추론할 수 없습니다.
일반적으로 SQL 쿼리의 순서는 다음 명령어를 사용하여 순서를 지정하지 않는 한ORDER BY
절을 클릭합니다.
MySQL 함수를 사용하여 원하는 작업을 수행할 수 있습니다.
SELECT * FROM foo f where f.id IN (2, 3, 1)
ORDER BY FIND_IN_SET(f.id, '2,3,1');
list 인수는 다음과 같습니다.FIND_IN_SET()
변수 길이 리스트는 의 인수와 같지 않습니다.IN()
. 문자열 리터럴 또는 를 사용해야 합니다.
퍼포먼스에 관한 질문:저도 궁금해서 둘 다 해봤어요.FIND_IN_SET()
및 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)
결론: 제한된 테스트에서는 두 방법 모두 큰 이점이 없습니다.
언급URL : https://stackoverflow.com/questions/1631723/maintaining-order-in-mysql-in-query
반응형
'source' 카테고리의 다른 글
Prepared Statement를 사용하여 삽입된 행의 ID를 반환하려면 어떻게 해야 합니까? (0) | 2023.01.09 |
---|---|
chown: '/var/lib/mysql/' 소유권 변경: 작업이 허용되지 않습니다. (0) | 2023.01.09 |
반복기를 목록으로 변환하는 가장 빠른 방법 (0) | 2023.01.09 |
8자만의 UUID 생성 (0) | 2023.01.09 |
지연 배열을 $.when()에 전달합니다. (0) | 2023.01.09 |