mysql怎么根据系统标识优先取最新系统的数据?

mysql怎么根据系统标识优先取最新系统的数据?

简单描述:需要展示机构名称、机构编码(可能是ORG_CODE,也可能是BASE_ORG_CODE,优先取值BASE_ORG_CODE),有三个系统,各系统数据优先级:3 > 2 > 1

需要支持:
1.数据优先级:系.统3 > 系,统2 > 系统1(不同系统之间部门名称可能不一致,如系统3部门名称为X_aa,系统2部门名称为X_bb)
2.在第1条的基础上优先取BASE_ORG_CODE字段作为机构编码,如果没有则取ORG_CODE字段
3.需根据机构名称进行右模糊查询
4.需根据机构编码精确查询
5.需要支持分页查询

create table tbl_org_info
(
    ID                  bigint auto_increment comment 'ID.'
    ORG_CODE            varchar(50)    default ''                not null comment '机构编码',
    BASE_ORG_CODE       varchar(50)    default ''                not null comment '机构编码(优先于org_code)',
    ORG_NAME            varchar(50)    default ''                not null comment '机构名称',
    SOURCE_TYPE         smallint(4)    default 1                 not null comment '数据来源,1,2,3'
 
)
阅读 1.5k
1 个回答

随便写的 SQL,没提供简易数据,我也测试不了。

主要思想:分组后取 SOURCE_TYPE 最大值所在行。

注:

  1. MySQL 有 子查询、关联子查询、自连接、窗口函数 4 种方法。我用了关联子查询,其他写法可参考MySQL 官方文档 - 分组后取某一列最大值所在行
  2. 如果是 SQLite 的话,可以直接 GROUP BY 后用 MAX(SOURCE_TYPE) 来取(参考 SQLite 官方文档 - 聚合查询中的裸列值

1. 根据右模糊的机构名称,查询机构编号

SELECT IF(LENGTH(BASE_ORG_CODE), BASE_ORG_CODE, ORG_CODE)
  FROM tbl_org_info t1
 WHERE ORG_NAME LIKE 'xxx%'
   AND SOURCE_TYPE = (SELECT MAX(SOURCE_TYPE)
                        FROM tbl_org_info t2
                       WHERE t1.ORG_NAME = t2.ORG_NAME);

2. 根据机构编码,查询最新的机构名称

SELECT ORG_NAME
  FROM tbl_org_info t1
 WHERE (BASE_ORG_CODE = 'xxx' OR (BASE_ORG_CODE = '' AND ORG_CODE = 'xxx'))
   AND SOURCE_TYPE = (SELECT MAX(SOURCE_TYPE)
                        FROM tbl_org_info t2
                       WHERE t1.ORG_CODE = t2.ORG_CODE
                         AND t1.BASE_ORG_CODE = t2.BASE_ORG_CODE);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏