2011-08-23 25 views
1

我需要2個查詢的聯合,但結果必須在一個特定的順序:如何對UNION的不同部分使用不同順序的UNION查詢的輸出進行排序?

1個查詢
  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 

注:我用type根據如果該行從1查詢或查詢2.來到我介紹了一個ordername列進行排序,並將其設置爲「」對於查詢2,它對這些行的順序沒有影響。

0

在選擇內部排序不會影響結果UNION查詢。
您只能放置從一個接一個地選擇的行。 例如,

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

此外,在這種情況下,你可以通過sort_by,media_title但排序中組魔神爲了行此人會在每個結果集影響秩序。 查看更多的信息在http://dev.mysql.com/doc/refman/5.1/en/union.html