복붙노트

[SQL] ()는 SQL IN의 값의 순서에 의해 절을 주문

SQL

()는 SQL IN의 값의 순서에 의해 절을 주문

IN () 절에있는 값의 순서에 의해 주문 (아마도 더 좋은 방법) 거리가 있는지 궁금하고있다.

문제는 내가 2 개 쿼리, 모든 ID와 두 번째를 검색하는 모든 정보가를 얻을 수 하나를 가지고있다. 첫째는 I로 구입 번째 원하는 ID의 순서를 생성한다. ID는 올바른 순서에 IN () 절에 배치됩니다.

그것은 (매우 간단) 같은 것 그래서 :

SELECT id FROM table1 WHERE ... ORDER BY display_order, name

SELECT name, description, ... WHERE id IN ([id's from first])

문제는 두 번째 쿼리는 ID가 IN () 절에 투입되는 동일한 순서로 결과를 반환하지 않습니다.

내가 찾은 하나의 해결책은 다음 두 번째 쿼리에 가입되어 자동 증가 필드 임시 테이블에 모든 ID를 넣어하는 것입니다.

더 나은 옵션이 있습니까?

참고 : 첫 번째 쿼리는 "사용자"를 실행하고, 두 번째는 백그라운드 프로세스로 실행되기 때문에, 서브 쿼리를 사용하여 2 일에 쿼리를 결합 할 수있는 방법이 없습니다.

내가 MySQL을 사용하고,하지만 난 그것뿐만 아니라 다른 DB를 거기에 어떤 옵션을 언급하는 것이 유용 할 수있다 생각하고 있어요.

해결법

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

    1.사용 MySQL은 FIELD () 함수 :

    사용 MySQL은 FIELD () 함수 :

    SELECT name, description, ...
    FROM ...
    WHERE id IN([ids, any order])
    ORDER BY FIELD(id, [ids in order])
    

    FIELD ()는 (첫 번째 파라미터 자체 이외) 첫번째 파라미터와 동일하다 제 파라미터의 인덱스를 반환 할 것이다.

    FIELD ( 'A', 'A', 'B', 'C')

    1을 반환합니다

    FIELD ( 'A', 'C', 'B', 'A')

    3을 반환합니다

    당신이 IN () 절과 같은 순서로 FIELD () 함수로 ID를 붙여 넣으면이 정확히 당신이 원하는 것을 할 것입니다.

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

    2.정렬 된 데이터를 가져 오는 방법은 다음을 참조하십시오.

    정렬 된 데이터를 가져 오는 방법은 다음을 참조하십시오.

    SELECT ...
      FROM ...
     WHERE zip IN (91709,92886,92807,...,91356)
       AND user.status=1
    ORDER 
        BY provider.package_id DESC 
         , FIELD(zip,91709,92886,92807,...,91356)
    LIMIT 10
    
  3. ==============================

    3.봄이 마음에 두 개의 솔루션 :

    봄이 마음에 두 개의 솔루션 :

    (INSTR ()는 오라클에서이며, 어쩌면 당신은 (위치) 또는 charIndex에 () 또는 같은 한)

  4. ==============================

    4.ANS는 정렬 된 데이터를 얻을 수 있습니다.

    ANS는 정렬 된 데이터를 얻을 수 있습니다.

    SELECT ...
    FROM ...
    ORDER  BY FIELD(user_id,5,3,2,...,50)  LIMIT 10
    
  5. ==============================

    5.당신은 MS SQL 서버 2008+에서 쿼리가 입력 한 값을 사용하여 쿼리에 임의의 정렬을 수행 할 경우, 즉석에서 테이블을 작성하고 그렇게 (OP에서 명칭을 사용)과 같은 조인 수행하여 수행 할 수 있습니다.

    당신은 MS SQL 서버 2008+에서 쿼리가 입력 한 값을 사용하여 쿼리에 임의의 정렬을 수행 할 경우, 즉석에서 테이블을 작성하고 그렇게 (OP에서 명칭을 사용)과 같은 조인 수행하여 수행 할 수 있습니다.

    SELECT table1.name, table1.description ... 
    FROM (VALUES (id1,1), (id2,2), (id3,3) ...) AS orderTbl(orderKey, orderIdx) 
    LEFT JOIN table1 ON orderTbl.orderKey=table1.id
    ORDER BY orderTbl.orderIdx
    

    당신은 같은 일을하지만, ANSI SQL에서 뭔가와 VALUES 문을 교체 할 경우, 다음이 어떤 SQL 데이터베이스에서 작동합니다.

    노트 : 레코드를 쿼리하는 단계 (100)보다 큰 정도를 설정할 때 생성 된 테이블 (orderTbl.orderIdx)의 두 번째 열이 필요하다. 나는 원래 orderIdx 열을 가지고 있지만, 100보다 큰 결과 세트로 I가 명시 적으로 해당 열을 기준으로 정렬 한 것으로 나타하지 않았다; 에서 SQL Server Express에 2014 어쨌든.

  6. ==============================

    6.

    SELECT ORDER_NO, DELIVERY_ADDRESS 
    from IFSAPP.PURCHASE_ORDER_TAB 
    where ORDER_NO in ('52000077','52000079','52000167','52000297','52000204','52000409','52000126') 
    ORDER BY instr('52000077,52000079,52000167,52000297,52000204,52000409,52000126',ORDER_NO)
    

    정말 좋은 일

  7. ==============================

    7.IN 절 값의 집합을 설명하고, 세트 순서가 없습니다.

    IN 절 값의 집합을 설명하고, 세트 순서가 없습니다.

    조인 후 display_order 열을 주문하면 가장 가까운 올바른 솔루션과 솔루션; 다른 건 아마 DBMS 고유의 해킹 (또는 표준 SQL의 OLAP 기능을 몇 가지 물건을하고있다). 물론 상기 가입 가장 가까운 휴대용 용액 (비록 display_order 값 데이터를 생성하는 것은 문제가 될 수 있음)이다. 당신이 주문 열을 선택해야 할 수도 있습니다; 나는 그것이 (SQL-92로 어쩌면 오래 전) 얼마 전에 원칙적으로 완화되었다 생각하지만, 표준 SQL의 요구 사항이 될하는 데 사용.

  8. ==============================

    8.Oracle의 경우, 존의 솔루션은 INSTR () 함수의 작품을 사용. 여기서 일한 약간 다른 솔루션입니다 - SELECT ID 표 FROM WHERE 번호 (1, 20, 45, 60) ORDER BY의 INSTR ( '1, 20, 45, 60', ID)

    Oracle의 경우, 존의 솔루션은 INSTR () 함수의 작품을 사용. 여기서 일한 약간 다른 솔루션입니다 - SELECT ID 표 FROM WHERE 번호 (1, 20, 45, 60) ORDER BY의 INSTR ( '1, 20, 45, 60', ID)

  9. ==============================

    9.사용 MySQL의 FIND_IN_SET 기능 :

    사용 MySQL의 FIND_IN_SET 기능 :

      SELECT * 
        FROM table_name 
       WHERE id IN (..,..,..,..) 
    ORDER BY FIND_IN_SET (coloumn_name, .., .., ..);
    
  10. ==============================

    10.내 첫번째 생각은 단일 쿼리를 작성했지만, 하나는 사용자가 실행하고 다른 백그라운드에서 실행되기 때문에이 방법을 사용할 수없는했다. 어떻게 백그라운드 프로세스로 사용자로부터 전달하는 ID의 목록을 저장하는? 왜 순서를 의미하는 열이있는 임시 테이블에 넣어 없습니다.

    내 첫번째 생각은 단일 쿼리를 작성했지만, 하나는 사용자가 실행하고 다른 백그라운드에서 실행되기 때문에이 방법을 사용할 수없는했다. 어떻게 백그라운드 프로세스로 사용자로부터 전달하는 ID의 목록을 저장하는? 왜 순서를 의미하는 열이있는 임시 테이블에 넣어 없습니다.

    어떻게 이것에 대해 이렇게 :

  11. ==============================

    11.난 당신이 가입하면 간단 할 것입니다하는 방식으로 데이터를 저장하기 위해 관리해야한다고 생각하고 더 해킹 및 복잡한 일이 진행되지 않도록 그것은 완벽 할 것입니다.

    난 당신이 가입하면 간단 할 것입니다하는 방식으로 데이터를 저장하기 위해 관리해야한다고 생각하고 더 해킹 및 복잡한 일이 진행되지 않도록 그것은 완벽 할 것입니다.

    내가 예를 들어 트랙 ID의 "최근 경기"목록을 가지고, SQLite는에 단순히 수행

    SELECT * FROM recently NATURAL JOIN tracks;
    
  12. ==============================

    12.난 그냥 이렇게 노력) 우리가 (FIELD이없는 경우 MS SQL 서버입니다 :

    난 그냥 이렇게 노력) 우리가 (FIELD이없는 경우 MS SQL 서버입니다 :

    SELECT table1.id
    ... 
    INNER JOIN
        (VALUES (10,1),(3,2),(4,3),(5,4),(7,5),(8,6),(9,7),(2,8),(6,9),(5,10)
        ) AS X(id,sortorder)
            ON X.id = table1.id
        ORDER BY X.sortorder
    

    내가 너무 중복을 허용하고 있습니다.

  13. ==============================

    13.이것을 샷 보내기

    이것을 샷 보내기

    SELECT name, description, ...
    WHERE id IN
        (SELECT id FROM table1 WHERE...)
    ORDER BY
        (SELECT display_order FROM table1 WHERE...),
        (SELECT name FROM table1 WHERE...)
    

    알의 아마 제대로 작동 상관 하위 쿼리를 얻기 위해 약간의 조정이 걸릴 것입니다,하지만 기본 원리는 소리를해야합니다.

  14. from https://stackoverflow.com/questions/396748/ordering-by-the-order-of-values-in-a-sql-in-clause by cc-by-sa and MIT license