CREATE TABLE IF NOT EXISTS T_ACC_ROLE (
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
PRIORITY int(4) default NULL COMMENT '优先权',
INFO int(4) default NULL COMMENT '信息',
PRIMARY KEY(ACC_ROLE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS T_ACC_ROLE_NOR (
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
INFO int(4) default NULL COMMENT '信息',
PRIMARY KEY(ACC_ROLE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;T_ACC_ROLE 数据
ACC_ROLE_ID ROLE_ID PRIORITY INFO
1 2 1 11
2 2 2 12
3 2 3 13
4 4 1 14T_ACC_ROLE_NOR 数据
ACC_ROLE_ID ROLE_ID INFO
1 2 16
2 3 17
4 5 19要采集这两个表的INFO,INFO在两个表中不会重复。但是T_ACC_ROLE 中有重复的ROLE_ID,这时候要PRIORITY 较小的信息,说白了是优先级别较高的信息。但是在T_ACC_ROLE_NOR 也有ROLE_ID,那么表T_ACC_ROLE_NOR 中的信息处于更高的优先级,那么就采用T_ACC_ROLE_NOR的信息。算法过程:例如:搜索表T_ACC_ROLE
有三个ROLE_ID=2的信息,取PRIORITY =1的信息。
但是在T_ACC_ROLE_NOR表中也有ROLE_ID=2的信息,那么T_ACC_ROLE 表的信息就是旧信息,不采用,使用T_ACC_ROLE_NOR 的信息。最后结果是:ROLE_ID INFO
2 16
3 17
4 14
5 19
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
PRIORITY int(4) default NULL COMMENT '优先权',
INFO int(4) default NULL COMMENT '信息',
PRIMARY KEY(ACC_ROLE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS T_ACC_ROLE_NOR (
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
INFO int(4) default NULL COMMENT '信息',
PRIMARY KEY(ACC_ROLE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;T_ACC_ROLE 数据
ACC_ROLE_ID ROLE_ID PRIORITY INFO
1 2 1 11
2 2 2 12
3 2 3 13
4 4 1 14T_ACC_ROLE_NOR 数据
ACC_ROLE_ID ROLE_ID INFO
1 2 16
2 3 17
4 5 19要采集这两个表的INFO,INFO在两个表中不会重复。但是T_ACC_ROLE 中有重复的ROLE_ID,这时候要PRIORITY 较小的信息,说白了是优先级别较高的信息。但是在T_ACC_ROLE_NOR 也有ROLE_ID,那么表T_ACC_ROLE_NOR 中的信息处于更高的优先级,那么就采用T_ACC_ROLE_NOR的信息。算法过程:例如:搜索表T_ACC_ROLE
有三个ROLE_ID=2的信息,取PRIORITY =1的信息。
但是在T_ACC_ROLE_NOR表中也有ROLE_ID=2的信息,那么T_ACC_ROLE 表的信息就是旧信息,不采用,使用T_ACC_ROLE_NOR 的信息。最后结果是:ROLE_ID INFO
2 16
3 17
4 14
5 19
FROM (
SELECT m.role_id, m.priority, m.info
FROM (
SELECT r.role_id as role_id, r.priority as priority, r.info as info
FROM t_acc_role r
UNION
SELECT n.role_id, -1, n.info
FROM t_acc_role_nor n
) m
ORDER BY m.role_id, m.priority
) t
GROUP BY t.role_id;MySQL 中采用 SELECT 选择的字段分不一定要出现在分组中,分组时会默认采用第一个,
虽然不符合 SQL 标准,但也算是一种办法吧。
from t_acc_role a
where a.priority=(select max(priority) from t_acc_role b where b.role_id=a.role_id)
and a.role_id not in (select role_id from t_acc_role_nor)
union
select role_id,info
from t_acc_role_nor
order by role_id
3楼的我觉得max(priority)应该改成min(priority),第一行再加一个distinct
我把表结构简化了,其实INFO来源一个表。 而且也不叫INFO,业务点实在太多,说的费劲,一会在发一贴,麻烦给看看!
FROM (
SELECT m.role_id, m.priority, m.info
FROM (
SELECT r.role_id as role_id, r.priority as priority, r.info as info
FROM t_acc_role r
UNION
SELECT n.role_id, -1, n.info
FROM t_acc_role_nor n
) m
ORDER BY m.role_id, m.priority
) t
GROUP BY t.role_id;