服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|

服务器之家 - 数据库 - Mysql - MySQL如何使用union all获得并集排序

MySQL如何使用union all获得并集排序

2021-01-11 23:11风缱云流 Mysql

这篇文章主要介绍了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语句如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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

延伸 · 阅读

精彩推荐
  • Mysqlmysql中模糊查询的四种用法介绍

    mysql中模糊查询的四种用法介绍

    这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下 ...

    MYSQL教程网4222020-03-21
  • MysqlMySQL 启动失败的常见原因

    MySQL 启动失败的常见原因

    MySQL 启动失败的最常见的原因有两类,分别是无法访问系统资源和参数设置错误造成的,下面分别分析如下。...

    今日头条2552020-11-10
  • MysqlMySQL中配置文件my.cnf因权限问题导致无法启动的解决方法

    MySQL中配置文件my.cnf因权限问题导致无法启动的解决方法

    这篇文章主要给大家介绍了关于MySQL中配置文件my.cnf因权限问题导致无法启动的解决方法,该无法启动的错误提示代码是:World-writable config file '/etc/my.cnf'...

    Carey5252020-07-31
  • MysqlLinux下MySQL 5.6.27 安装教程

    Linux下MySQL 5.6.27 安装教程

    这篇文章主要为大家详细介绍了Linux下MySQL 5.6.27 安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    张思思5102020-08-03
  • Mysql浅谈mysql可有类似oracle的nvl的函数

    浅谈mysql可有类似oracle的nvl的函数

    下面小编就为大家带来一篇浅谈mysql可有类似oracle的nvl的函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    MYSQL教程网3082020-07-18
  • MysqlMySQL高可用解决方案MMM(mysql多主复制管理器)

    MySQL高可用解决方案MMM(mysql多主复制管理器)

    MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,如果当前的主服...

    三极行者2502020-08-14
  • MysqlMysql中的Btree与Hash索引比较

    Mysql中的Btree与Hash索引比较

    这篇文章主要介绍了Mysql中的Btree与Hash索引比较,本文起讲解了B-Tree 索引特征、Hash 索引特征等内容,需要的朋友可以参考下 ...

    MYSQL教程网1812020-04-30
  • MysqlMySQL最基本的命令使用汇总

    MySQL最基本的命令使用汇总

    这篇文章为大家分享了MySQL最基本的命令使用汇总,MySQL最基本的命令使用,包括如何正确连接MySQL(和PHP搭配之最佳组合),修改密码与增加新用户等相关内...

    MYSQL教程网4622020-05-21