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)