MySQL中使用union all获得并集的排序

  项目中有时候因为某些不可逆转的原因使得表中存储的数据难以满足在页面中的展示要求。之前的项目上有文章内容的展示功能,文章分为三个状态待发布、已发布、已下线。他们在数据表中判断状态的字段(PROMOTE_STATUS)值分别为0、1、2。一开始的需求是文章只展示待发布和已发布,已发布排在待发布前面,并且两种状态下在根据自己的情况去排序。这样的实现比较简单,如下的order by语句就可以实现了。

  order by  PROMOTE_STATUS desc ,SEQUENCE_ID desc......

  结果移交测试之后,产品觉得这里可以优化下,文章的展示要改为已发布、待发布、已下线(没错,已下线它突然就要了,而且很傲娇的排在了最后)。那怎么办嘞?改表将已发布、待发布、已下线的PROMOTE_STATUS对应值改为2、1、0肯定是行不通的,因为这个表其他的同事也用了。若是改了这里的对应关系。其他同事的代码的判断逻辑都得动。所以就想到了union all,然后还需要实现文章在三个状态下的各自展示顺序。所以,最终的思路就是将PROMOTE_STATUS分别为1、0、2时的数据查出来,然后根据每种状态下的情况进行order by排序,最后将各个子集union all之后返回给页面展示。

  最终的sql语句如下:

select
    PROMOTE_ID,
    SEQUENCE_ID,
    PROMOTE_STATUS,
       PROMOTE_TITLE,
       RELEASE_DATE
        FROM (
            (SELECT
               PROMOTE_ID,
            SEQUENCE_ID,
            PROMOTE_STATUS,
               PROMOTE_TITLE,
               RELEASE_DATE
              FROM SYS_TEXT_PROMOTE
              WHERE
                 ENABLED_FLAG = ‘1‘
                 AND PROMOTE_STATUS=1
                 AND SORT_ID = #{params.sortId}
                 order by SEQUENCE_ID DESC,LAST_UPDATE_DATE DESC) a)
union all
select
    PROMOTE_ID,
    SEQUENCE_ID,
    PROMOTE_STATUS,
       PROMOTE_TITLE,
       RELEASE_DATE
        FROM (
            (SELECT
               PROMOTE_ID,
            SEQUENCE_ID,
            PROMOTE_STATUS,
               PROMOTE_TITLE,
               RELEASE_DATE
              FROM SYS_TEXT_PROMOTE
              WHERE
                ENABLED_FLAG = ‘1‘
                AND PROMOTE_STATUS=2
                AND SORT_ID = #{params.sortId}
                order by RELEASE_DATE DESC,LAST_UPDATE_DATE DESC) b)
union all
select
    PROMOTE_ID,
    SEQUENCE_ID,
    PROMOTE_STATUS,
       PROMOTE_TITLE,
       RELEASE_DATE
        FROM (
            (SELECT
               PROMOTE_ID,
            SEQUENCE_ID,
            PROMOTE_STATUS,
               PROMOTE_TITLE,
               RELEASE_DATE
              FROM SYS_TEXT_PROMOTE
               WHERE
               ENABLED_FLAG = ‘1‘
               AND PROMOTE_STATUS=0
               AND SORT_ID = #{params.sortId}
               order by RELEASE_DATE DESC,LAST_UPDATE_DATE DESC) c) 
 

    

原文地址:https://www.cnblogs.com/8593l/p/10136338.html

时间: 2024-11-13 21:06:53

MySQL中使用union all获得并集的排序的相关文章

MySQL中UNION和UNION ALL的使用

在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION.如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排

mysql中UNION ALL用法

MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 union select * from table2 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序. MySQL中的UNION ALL UNION ALL只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集

MySQL中使用INNER JOIN来实现Intersect并集操作

MySQL中使用INNER JOIN来实现Intersect并集操作 一.业务背景 我们有张表设计如下: CREATE TABLE `user_defined_value` ( `RESOURCE_ID` varchar(20) DEFAULT NULL, `COLUMN_NAME` varchar(20) DEFAULT NULL, `VALUE` varchar(255) DEFAULT NULL, KEY `ID_IDX` (`RESOURCE_ID`) ) ENGINE=MyISAM D

MySQL中union和order by一起使用的方法

MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage of UNION and ORDER BY. SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASCUNIONSELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC

mysql中 union连接

SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...] UNION用于把来自许多SELECT语句的结果组合到一个结果集合中. 列于每个SELECT语句的对应位置的被选择的列应具有相同的类型.(例如,被第一个语句选择的第一列应和被其它语句选择的第一列具有相同的类型.)在第一个SELECT语句中被使用的列名称也被用于结果的列名称. SELECT语句为常规的选择语句,但是受到如下的限定: ·   

MYSQL中JOIN的用法

近期用phpcms v9做项目,初期没有问题,后期随着数据量的增大,phpcms v9后台出现的栏目更新不动的情况,初期我以为是程序的问题,进行了程序排查,没有发现任何问题,登录上centos服务器后free命令发现内存也没有满.瞬间感觉很蛋疼,不知如何处理,后来登录阿里云账号,发现更新栏目时,cpu使用率直接到达100%,xhell远程登录进入服务器后用top检测cpu使用率的情况,发现MySQL占用的cpu使用率的100%,直接登录进入MySQL数据库,输入show full process

mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.

一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 10000;优化后:Select id from uinfo_jifen where jifen>600000; 2.应尽量避免在where子句中对字段进行函数操作,这将导致mysql放弃使用索引 select uid from imid where datediff(create_time,'2011-11

MySQL中EXPLAIN详解

MySQL中EXPLAIN详解 explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如:explain select username,first_name form hx,itlearner where a.id=b.id EXPLAIN列的解释: id:本次 select 的标识符.在查询中每个 select都有一个顺序的数值. select_type :查询类

mysql中INSTR函数的用法

INSTR(字段名, 字符串) 这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) SELECT * FROM tblTopic ORDER BY INSTR( topicTitle, 'ha' ) > 0 DESC SELECT INSTR( topicTitle, 'ha' ) FROM tblTopic mysql中使用instr配合IN排序 将instr结果作为一列,按其排序 select id,1 from world_guide where