本帖最后由 u013293043 于 2014-03-25 14:43:29 编辑

解决方案 »

  1.   

    SELECT a.id,b.name1,b1.name2 FROM (
     SELECT * FROM test2
    UNION 
    SELECT * FROM test1) a
    LEFT JOIN test1 b ON a.id=b.id AND a.name2=b.name1 
    LEFT JOIN test2 b1 ON a.id=b1.id AND a.name2=b1.name2 
      

  2.   

    你这个设计是存在问题的
    两个表之间关联的只有ID,但是同一ID条目数不一样
    NAME之间到底有没有关系?
      

  3.   

    是两套系统分别出来的报表,所以除了ID号以外,没有别的关联,就是想做个汇总查询,挺头疼的。
    另外2楼给的代码中单独查询 
     SELECT * FROM test2
     UNION 
     SELECT * FROM test1
     为什么查询结果是
     id          name2    
       01           A1        
       01           A2  
       01           A3 
       02           B1  
       02           b2
    两个表的name1与name2是不相同的,union应该不会去重啊,我理解的结果应该是
      id          name2    
       01          a1                                    
       01          a2  
       01          A1        
       01          A2  
       01          A3                                                   
       02          b1
       02          b2 
    所以我的实际需求中,应用2楼的代码,还是存在问题。 
      

  4.   

    union应该不会去重啊
    UNION ALL才不会去重,自己查查资料
      

  5.   


    百度了一下 mysql字段的值默认不区分大小写。。
    我把需求重新改一下吧,test2 表的 name值改成C、 Dcreate table test1
      (
      id   varchar(10),
      name1 varchar(20)
      );
      insert into test1 select '01','A1';
      insert into test1 select '01','A2';
      insert into test1 select '02','B1';
      insert into test1 select '02','B2'; create table test2
      (
      id   varchar(10),
      name2 varchar(20)
      );
      insert into test2 select '01','C1';
      insert into test2 select '01','C2';
      insert into test2 select '01','C3';
      insert into test2 select '02','D1'; /*           表1 test1                                 
       id          name1                             
       01          A1                                    
       01          A2                                                    
       02          B1
       02          B2               
                                
                  表2  test2       
       id          name2    
       01           C1        
       01           C2  
       01           C3 
       02           D1  
                           
       两个表之间关联的只有ID,但是同一ID条目数不一样
      要得到这样的报表
     id          name1          name2
       01          A1                  C1
       01          A2                  C2
       01          null                C3
       02          B1                  D1
       02          B2                  null
      
     */ drop table test1;
     drop table test2; 麻烦2楼再帮我改改吧,用之前的代码查询结果不正确了。
      

  6.   

    两表中加入唯一标识的字段ID,将上述name字段修改为ID
      

  7.   

    mysql> select * from test1;
    +------+-------+
    | id   | name1 |
    +------+-------+
    | 01   | A1    |
    | 01   | A2    |
    | 02   | B1    |
    | 02   | B2    |
    +------+-------+
    4 rows in set (0.00 sec)mysql> select * from test2;
    +------+-------+
    | id   | name2 |
    +------+-------+
    | 01   | C1    |
    | 01   | C2    |
    | 01   | C3    |
    | 02   | D1    |
    +------+-------+
    4 rows in set (0.00 sec)mysql>
    mysql> set @r1=0;
    Query OK, 0 rows affected (0.00 sec)mysql> set @id1=0;
    Query OK, 0 rows affected (0.00 sec)mysql>
    mysql> set @r2=0;
    Query OK, 0 rows affected (0.00 sec)mysql> set @id2=0;
    Query OK, 0 rows affected (0.00 sec)mysql>
    mysql> select id,max(name1) ,max(name2)
        -> from (
        ->  (select @r1:=if(@id1!=id,1,@r1+1) as rownum,@id1:=id,id,name1,null as name2 from test1 order by id,name1 )
        ->  union all
        ->  (select @r2:=if(@id2!=id,1,@r2+1) as rownum,@id2:=id,id,null,name2 from test2 order by id,name2 )
        -> ) t
        -> group by id,rownum;
    +------+------------+------------+
    | id   | max(name1) | max(name2) |
    +------+------------+------------+
    | 01   | A1         | C1         |
    | 01   | A2         | C2         |
    | 01   | NULL       | C3         |
    | 02   | B1         | D1         |
    | 02   | B2         | NULL       |
    +------+------------+------------+
    5 rows in set (0.00 sec)mysql>