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

解决方案 »

  1.   

    SELECT t.role_id, t.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;MySQL 中采用 SELECT 选择的字段分不一定要出现在分组中,分组时会默认采用第一个,
    虽然不符合 SQL 标准,但也算是一种办法吧。
      

  2.   

    小菜一碟:select role_id, info
    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.   

    难度还行啦,我稍微想想也能写出来,1楼的order by 我一开始还觉得不对劲,看了解释才明白。
    3楼的我觉得max(priority)应该改成min(priority),第一行再加一个distinct
      

  4.   

    哦,distinct不用了,如果两个记录role_id一样priority也一样info也不一样,distinct也没用,就都选出来好了。
      

  5.   


    我把表结构简化了,其实INFO来源一个表。 而且也不叫INFO,业务点实在太多,说的费劲,一会在发一贴,麻烦给看看!
      

  6.   

    大家请看:http://topic.csdn.net/u/20090512/16/c0642219-6c81-407e-bfc9-f7902341dc65.html
      

  7.   

    SELECT t.role_id, t.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;