복붙노트

[SQL] MySQL은 절에 의해 노동 조합 및 순서를 사용하여

SQL

MySQL은 절에 의해 노동 조합 및 순서를 사용하여

나는 MySQL은 쿼리에서 조합과에 의해 순서를 사용하고 싶습니다. 내 사이트에서 검색을 위해 거리에 따라 테이블에서 서로 다른 기준에 따라 기록의 다른 유형을 가져 오는하고있다. 정확한 장소 검색과 관련된 첫 번째 선택 쿼리의 데이터를 반환합니다. 장소에서 5 킬로미터 이내 거리에 관한 제 2 선택 쿼리 반환 데이터를 검색. 장소에서 5 ~ 15 kms 이내 거리에 관한 제 3 선택 쿼리 반환 데이터를 검색.

그리고 내가 모든 결과를 병합하고 페이징이있는 페이지에 표시 할 조합을 사용하고 있습니다. '정확한 검색 결과'등 '5 kms 이내 결과'적절한 제목 아래

지금은 ID 또는 add_date에 따라 결과를 정렬하고 싶습니다. 하지만 난 내 쿼리 (쿼리 1의 통합 쿼리 add_date에 의해 2 노조 쿼리 3 차)의 끝에서 ORDER BY 절을 추가 할 때. 그것은 모든 결과를 정렬합니다. 하지만 내가 원하는 것은 각 제목 아래에 분류해야한다.

해결법

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

    1.당신은 각각의 선택에 순위라는 의사 열을 추가하여이 작업을 수행 할 수 있습니다 당신은 일종의 처음으로 할 수있는, 예컨대 다른 기준에 의해 정렬하기 전에 :

    당신은 각각의 선택에 순위라는 의사 열을 추가하여이 작업을 수행 할 수 있습니다 당신은 일종의 처음으로 할 수있는, 예컨대 다른 기준에 의해 정렬하기 전에 :

    select *
    from (
        select 1 as Rank, id, add_date from Table 
        union all
        select 2 as Rank, id, add_date from Table where distance < 5
        union all
        select 3 as Rank, id, add_date from Table where distance between 5 and 15
    ) a
    order by rank, id, add_date desc
    
  2. ==============================

    2.이 작업을 수행하는 하위 쿼리를 사용할 수 있습니다 :

    이 작업을 수행하는 하위 쿼리를 사용할 수 있습니다 :

    select * from (select values1 from table1 order by orderby1) as a
    union all
    select * from (select values2 from table2 order by orderby2) as b
    
  3. ==============================

    3.

    (select add_date,col2 from table_name) 
      union 
    (select add_date,col2 from table_name) 
      union 
    (select add_date,col2 from table_name) 
    
    order by add_date
    
  4. ==============================

    4.통합 쿼리는 IIRC, BY 절을 하나 개의 마스터 주문을 할 수 있습니다. 이를 얻으려면 더 큰의 UNION 쿼리를 구성하는 각 쿼리에 정렬 UNION의 ORDER BY에 의해 하나 개의 필드 당신이 될 것입니다 필드를 추가합니다.

    통합 쿼리는 IIRC, BY 절을 하나 개의 마스터 주문을 할 수 있습니다. 이를 얻으려면 더 큰의 UNION 쿼리를 구성하는 각 쿼리에 정렬 UNION의 ORDER BY에 의해 하나 개의 필드 당신이 될 것입니다 필드를 추가합니다.

    예를 들어, 당신은 뭔가를해야 할 수도 있습니다

    SELECT field1, field2, '1' AS union_sort
    UNION SELECT field1, field2, '2' AS union_sort
    UNION SELECT field1, field2, '3' AS union_sort
    ORDER BY union_sort
    

    그 union_sort 필드는별로 정렬 할 수 있습니다 무엇이든 할 수있다. 이 예에서, 단지 제 등 첫 번째 테이블 번째 테이블 둘째, 결과를 넣어 일어나는

  5. ==============================

    5.잊지 마세요, 노동 조합의 모든 정렬 또는 (노조 반대) 병합하지 않고 레코드 집합에 레코드를 추가하는 방법입니다.

    잊지 마세요, 노동 조합의 모든 정렬 또는 (노조 반대) 병합하지 않고 레코드 집합에 레코드를 추가하는 방법입니다.

    그래서 예를 들면 :

    select * from (
        select col1, col2
        from table a
        <....>
        order by col3
        limit by 200
    ) a
    union all
    select * from (
        select cola, colb
        from table b
        <....>
        order by colb
        limit by 300
    ) b
    

    그것은 각각의 쿼리가 명확 유지하고 각 쿼리에 다른 매개 변수를 기준으로 정렬 할 수 있습니다. 그러나 선택한 답변의 방법을 사용하여 복잡성과 얼마나 관련이 종류를 개념화하고 있기 때문에 데이터가에 따라 명확하게 될 수 있습니다. 또한 그것으로 정렬하거나 구성 할 수있는 상황이있다, 그래서 당신은 쿼리 프로그램에 인공 열을 반환 할 수 있습니다.

    그러나이 방법은, 빨리되는 별도의 변수를 도입하지 및 정렬을 포함하여 각 쿼리를 분리하기 쉽게 그것을 만드는 장점이 있습니다. 한계를 추가 할 수있는 기능은 단순히 추가 보너스입니다.

    물론 모든 노동 조합에 노조를 설정하고 전체 쿼리에 대한 정렬을 추가 주시기 바랍니다. 또는이 방법으로 쉽게 각 쿼리에 다른 매개 변수를 기준으로 정렬 할 수있는 경우에 인공 ID를 추가 할 수 있지만 그렇지 않으면 허용 대답과 동일합니다.

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

    6.A는 플러스 조합에 가입에 나는이 작업을 얻었다.

    A는 플러스 조합에 가입에 나는이 작업을 얻었다.

    (SELECT 
       table1.column1,
       table1.column2,
       foo1.column4
     FROM table1, table2, foo1, table5
     WHERE table5.somerecord = table1.column1
     ORDER BY table1.column1 ASC, table1.column2 DESC
    )
    
    UNION
    
    (SELECT
        ... Another complex query as above
    )
    
    ORDER BY column1 DESC, column2 ASC
    
  7. ==============================

    7.당신이 UNION의 MySQL과 함께 사용되는 서브 쿼리의 절 내부에 의해 주문을 사용하는 경우 ORDER BY 절을 최적화 할 것입니다.

    당신이 UNION의 MySQL과 함께 사용되는 서브 쿼리의 절 내부에 의해 주문을 사용하는 경우 ORDER BY 절을 최적화 할 것입니다.

    기본적으로 UNION 그렇게 따라서 ORDER BY가 아무것도하지 않는 것 정렬되지 않은 목록을 반환하기 때문입니다.

    최적화는 문서에 언급 말한다있다 :

    이것의 마지막 문장은 영향을해야하기 때문에 약간 오해의 소지가있다. 당신이 하위 쿼리 내 주문해야 상황에있을 때이 최적화 문제가 발생합니다.

    당신이 그렇게 같은 LIMIT 절을 추가 할 수 있습니다이 최적화를 수행하지 MySQL을 강제로 :

    (SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
    UNION ALL
    (SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
    UNION ALL
    (SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)
    

    당신이 매김과 같은 일을 할 경우 추가 할 수 있습니다 높은 LIMIT 수단은 전체 쿼리 OFFSET.

    이 또한 각 조합에 대해 서로 다른 컬럼에 의해 ORDER 할 수있는 추가 혜택을 제공합니다.

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

    8.시험:

    시험:

    SELECT result.* 
    FROM (
     [QUERY 1]
     UNION
     [QUERY 2]
    ) result
    ORDER BY result.id
    

    [쿼리 1] 및 [QUERY 2] 병합 할 것을 당신의 두 쿼리입니다 경우.

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

    9.당신은 전체 결과 집합을 정렬하고 있기 때문에이 별도로, 당신은 일종의해야, 노동 조합의 모든 부분, 또는 당신은 ORDER BY (문제 즉. 서브 쿼리 거리) THEN (뭔가 즉, 행 ID) 절을 사용할 수 있습니다

    당신은 전체 결과 집합을 정렬하고 있기 때문에이 별도로, 당신은 일종의해야, 노동 조합의 모든 부분, 또는 당신은 ORDER BY (문제 즉. 서브 쿼리 거리) THEN (뭔가 즉, 행 ID) 절을 사용할 수 있습니다

  10. ==============================

    10.내가 좋아하는 unioning하기 전에 각 쿼리에 의해 순서를 추가 시도

    내가 좋아하는 unioning하기 전에 각 쿼리에 의해 순서를 추가 시도

    (select * from table where distance=0 order by add_date) 
    union 
    (select * from table where distance>0 and distance<=5 order by add_date)
    

    그러나 그것은 작동하지 않았다. 실제로 각 선택의 행 내 순서를하지 않았다.

    난 당신처럼 뭔가를 외부에 의해 순서를 유지하여 주문 where 절에 열을 추가해야합니다 생각

    (select * from table where distance=0) 
    union 
    (select * from table where distance>0 and distance<=5) 
    order by distance, add_date
    

    당신이 범위에 의해 그룹에 원하기 때문에이 조금 까다로운 일이 될 수 있지만, 나는 그것을 행할 수 있어야한다고 생각합니다.

  11. from https://stackoverflow.com/questions/3531251/using-union-and-order-by-clause-in-mysql by cc-by-sa and MIT license