mysql - 如何为 UNION 的不同部分以不同的顺序对 UNION 查询的输出进行排序?

标签 mysql

我需要 2 个查询的联合,但结果必须按特定顺序排列:

  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

但是顺序错了。我该如何解决这个问题?

最佳答案

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 这样它就不会影响这些行的顺序。

关于mysql - 如何为 UNION 的不同部分以不同的顺序对 UNION 查询的输出进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7161226/

相关文章:

MySQL 获取 X 天内回复最多的线程 join 线程大约需要 1 秒

mysql 使用其他表中的数据更新

mysql - 在连接表中插入附加数据

php - 使用 mySQL 和 PHP 每 5 秒更新一次 HTML 表?

插入前使用 INSERT IGNORE 触发 MySQL

php - Sql 查询执行超过 smarty 的时间

Mysql 按多个列值连接和过滤

MYSQL:如何计算重复行并将标记附加到现有值

mysql - 更新 MySQL 数据库表架构

mysql - 尽管我在RDS实例的安全组中指定了入站规则,但登录失败