복붙노트

[SQL] MySQL의 "IN"쿼리의 질서를 유지

SQL

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)

해결법

  1. ==============================

    1.다른 대답은 언급대로 : 당신이 게시 된 쿼리는 당신이 당신의 결과, 당신이 얻을 싶은 단지 결과를 싶습니다 주문 것에 대해 아무런 상관이 없습니다.

    다른 대답은 언급대로 : 당신이 게시 된 쿼리는 당신이 당신의 결과, 당신이 얻을 싶은 단지 결과를 싶습니다 주문 것에 대해 아무런 상관이 없습니다.

    결과를 주문하려면, 내가) (ORDER BY 필드를 사용합니다 :

    SELECT * FROM foo f where f.id IN (2, 3, 1)
    ORDER BY FIELD(f.id, 2, 3, 1);
    

    필드로 인수 목록은 가변 길이 될 수 있습니다.

  2. ==============================

    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)
    

    결론 : 제한된 테스트와 함께, 더 큰 장점 중 하나 방법이 없습니다.

  3. from https://stackoverflow.com/questions/1631723/maintaining-order-in-mysql-in-query by cc-by-sa and MIT license