2011-08-23 3 views
1

나는이 쿼리의 결합이 필요하지만 결과는 특정 순서에 있어야합니다 : 1 개 쿼리UNION의 다른 부분에 대해 다른 주문을 사용하여 UNION 쿼리의 결과를 정렬하려면 어떻게합니까?

  1. 먼저해야 결과, 이름으로 정렬.
  2. 다른 결과는 2 개의 쿼리와 날짜로 정렬되어야합니다.

나는이 쿼리 작성 :

SELECT * FROM (
       (SELECT c.category_id as media_id, 
         null as media_users_id, 
         c2l.category_name as media_title, 
         null as media_duration, 
         null as media_upload_timestamp, 
         null as media_key, 
         null as media_conversion_info, 
         null as media_type, 
         null as media_views, 
         null as media_embed_views, 
         null as media_comments_count, 
         null as media_accept_ratings, 
         null as media_accept_comments, 
         NOW() as media_upload_date, 
         null as media_ratings_sum, 
         null as media_ratings_count, 
         null as categories2media_category_id, 
         null as categories2media_media_id, 
         1 as type 
         FROM ost_categories c 
         LEFT JOIN ost_categories2language c2l 
         ON c2l.category_id = c.category_id 
         WHERE c2l.category_language = 'russian' AND c.category_parent_id = '60' AND c.is_group = '1' 
         ORDER BY media_title) 

          UNION 

       (SELECT 
          m.media_id, 
          m.media_users_id, 
          m.media_title, 
          m.media_duration, 
         UNIX_TIMESTAMP(m.media_upload_date) media_upload_timestamp, 
          m.media_key, 
          m.media_conversion_info, 
          m.media_type, 
          m.media_views, 
          m.media_embed_views, 
          m.media_comments_count, 
          m.media_accept_ratings, 
          m.media_accept_comments, 
          m.media_upload_date, 
          m.media_ratings_sum, 
          m.media_ratings_count, 
          c2m.categories2media_category_id, 
          c2m.categories2media_media_id, 
          0 as type 
         FROM ost_media m, 
          ost_categories2media c2m 
         WHERE c2m.categories2media_category_id = '60' 
          AND c2m.categories2media_media_id = m.media_id 
          AND m.media_type = 'video' 
          AND (m.media_access='public' OR (m.media_access='private' AND m.media_users_id=2)) 
          AND m.media_conversion_status = 'success' 
          AND m.media_notified_status = 'legal' ORDER BY m.media_upload_date DESC) 
       ) t LIMIT 0,28 

을하지만 순서가 잘못되었습니다. 어떻게 해결할 수 있을까요?

+0

제안 : 귀하의 질문에서 선택한 열 이름을 여러 개 (예 : 10 개 이상 생략 할 수 있음) 질문을 더 간단하고 쉽게 이해할 수 있습니다. 전체 쿼리가 더 복잡하다는 것을 나타 내기 위해'- 그리고 다른 값들 '또는 이와 비슷한 것을 남길 수 있습니다. 이렇게하면 스크롤바가 없어도 전체 쿼리가 질문에 표시 될 수 있습니다. 이는 일반적으로 바람직합니다. –

답변

0

UNION 쿼리 결과가 정렬되는 방식에 상관없이 UNION 외부의 순서를 지정해야합니다.

SELECT * FROM (
      (SELECT c.category_id as media_id, 
        null as media_users_id, 
        c2l.category_name as media_title, 
        null as media_duration, 
        null as media_upload_timestamp, 
        null as media_key, 
        null as media_conversion_info, 
        null as media_type, 
        null as media_views, 
        null as media_embed_views, 
        null as media_comments_count, 
        null as media_accept_ratings, 
        null as media_accept_comments, 
        NOW() as media_upload_date, 
        null as media_ratings_sum, 
        null as media_ratings_count, 
        null as categories2media_category_id, 
        null as categories2media_media_id, 
        1 as type 
        c2l.category_name AS ordername 
        FROM ost_categories c 
        LEFT JOIN ost_categories2language c2l 
        ON c2l.category_id = c.category_id 
        WHERE c2l.category_language = 'russian' AND c.category_parent_id = '60' AND c.is_group = '1') 

         UNION 

      (SELECT 
         m.media_id, 
         m.media_users_id, 
         m.media_title, 
         m.media_duration, 
         UNIX_TIMESTAMP(m.media_upload_date) media_upload_timestamp, 
         m.media_key, 
         m.media_conversion_info, 
         m.media_type, 
         m.media_views, 
         m.media_embed_views, 
         m.media_comments_count, 
         m.media_accept_ratings, 
         m.media_accept_comments, 
         m.media_upload_date, 
         m.media_ratings_sum, 
         m.media_ratings_count, 
         c2m.categories2media_category_id, 
         c2m.categories2media_media_id, 
         0 as type 
         "" AS ordername 
        FROM ost_media m, 
         ost_categories2media c2m 
        WHERE c2m.categories2media_category_id = '60' 
         AND c2m.categories2media_media_id = m.media_id 
         AND m.media_type = 'video' 
         AND (m.media_access='public' OR (m.media_access='private' AND m.media_users_id=2)) 
         AND m.media_conversion_status = 'success' 
         AND m.media_notified_status = 'legal') 
      ) t 
ORDER BY t.type DESC, t.ordername ASC, t.media_upload_date DESC 
LIMIT 0,28 

참고 : 나는이 ordername 열을 도입 행이 쿼리 1 또는 쿼리 2에서 온 경우에 따라 분류하고 설정하는 type 사용을 ""

은 당신이 뭔가를 할 필요가 쿼리 2의 경우 해당 행의 순서에 영향을주지 않습니다.

0

내부 선택을 정렬해도 결과 UNION 쿼리에 영향을주지 않습니다.
행을 하나씩 선택할 수 있습니다. 예를 들어 ,

(select 1 sort_by, .....) 
union 
(select 2, .....) order by sort_by. 

또한이 경우에 당신은 sort_by, MEDIA_TITLE에 의해 그룹 loke 순서 내부의 열을 정렬 할 수 있습니다 그러나 이것은 각각 결과 집합의 순서에 영향을 미칠 것이다. 자세한 내용을 보시려면 http://dev.mysql.com/doc/refman/5.1/en/union.html

관련 문제