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'

)
INSERT INTO `test`.`test_net_org`(`id`, `org_code`, `base_org_code`, `org_name`, `source_type`) VALUES (1, 'ORG001', '', '机构1',  '2');
INSERT INTO `test`.`test_net_org`(`id`, `org_code`, `base_org_code`, `org_name`, `source_type`) VALUES (2, 'ORG002', 'ORG001', '机构1-新',  '3');
INSERT INTO `test`.`test_net_org`(`id`, `org_code`, `base_org_code`, `org_name`, `source_type`) VALUES (3, 'ORG003', '', '机构3',  '2');
INSERT INTO `test`.`test_net_org`(`id`, `org_code`, `base_org_code`, `org_name`, `source_type`) VALUES (4, 'ORG004', '', '机构4',  '3');
INSERT INTO `test`.`test_net_org`(`id`, `org_code`, `base_org_code`, `org_name`, `source_type`) VALUES (5, 'ORG005', 'ORG003', '机构3-新',  '1');
INSERT INTO `test`.`test_net_org`(`id`, `org_code`, `base_org_code`, `org_name`, `source_type`) VALUES (6, 'ORG006', NULL, '机构6',  '2');

插入以上数据,预期结果如下:
ORG001 机构1-新
ORG003 机构3-新
ORG004 机构4
ORG006 机构6

CSDN不允许重复词汇,问题描述其他链接:https://segmentfault.com/q/1010000042511688


select 
          ORG_NAME, 
           case BASE_ORG_CODE when BASE_ORG_CODE is null ORG_CODE else BASE_ORG_CODE  end ORG_CODE 
from 
      tbl_org_info
where 
      ORG_NAME like "xxx%"
      and (ORG_CODE  = 'xxx' or BASE_ORG_CODE  = 'xxx')
order by 
      SOURCE_TYPE desc
limit 0, 10

先根据条件找到对应的机构编码,然后再用这个机构编码去查这个表,按照系统来源排序,
比如下面这个例子,用X_bb的机构名称查,最后查出来的是X_aa的记录

select org_name,ifnull(base_org_code,org_code) org_code
from tbl_org_info 
where ifnull(base_org_code,org_code) in (
select ifnull(base_org_code,org_code) 
from tbl_org_info 
where org_name like 'X_bb%')
order by SOURCE_TYPE desc limit 1;

你不是说2个表么?看你上面只展示一个表呀

看下能这样些吗,题目的含义不是特别的清晰


SELECT IFNULL(BASE_ORG_CODE,ORG_CODE) orgcode,ORG_NAME from tbl_org_info
 where ORG_NAME like 'xx%' and IFNULL(BASE_ORG_CODE,ORG_CODE)='' ORDER BY SOURCE_TYPE desc OFFSET 0 LIMIT 2

```

可以把另外一张表补充上。
你上面说的,“系统3,系统2的部门名称不一样时还是取的系统2”,描述清楚。
如果是一张表,可以使用下面的语句。

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',
    primary key(ID)
 );

insert into tbl_org_info(ORG_CODE, BASE_ORG_CODE, ORG_NAME, SOURCE_TYPE) values ('cc', 'cc1', 'X_cc', 1), ('bb', '', 'X_bb', 2), ('aa', 'aa1', 'X_aa', 3);

select ORG_NAME, case when BASE_ORG_CODE != '' then BASE_ORG_CODE else ORG_CODE end CODE from tbl_org_info
where ORG_NAME like 'X_%' and (ORG_CODE = 'cc' or BASE_ORG_CODE = 'cc')
order by SOURCE_TYPE desc;
+----------+------+
| ORG_NAME | CODE |
+----------+------+
| X_cc     | cc1  |
+----------+------+
1 row in set (0.00 sec)

root [test]> select * from tbl_org_info;
+----+----------+---------------+----------+-------------+
| ID | ORG_CODE | BASE_ORG_CODE | ORG_NAME | SOURCE_TYPE |
+----+----------+---------------+----------+-------------+
|  7 | cc       | cc1           | X_cc     |           1 |
|  8 | bb       |               | X_bb     |           2 |
|  9 | aa       | aa1           | X_aa     |           3 |
+----+----------+---------------+----------+-------------+
3 rows in set (0.00 sec)