假设有一台数据库地址为192.168.1.1
里面有表customer
字段id customername number_id另一台数据库服务器地址为192.168.1.2
里面有表number
字段id numbername现在我想显示customername,numbername
如何进行2个数据库的关联查询另外,不要先查出number_id带入192.168.1.2服务器中查numbername。我要2台数据库表直接关联查询。。
类似一台服务器2表关联的left join那种。。有没有办法?

解决方案 »

  1.   

    是MYSQL?如是,要安装FEDERATED 存储引擎才行
      

  2.   

    FEDERATED,把N个库中的表视作一个表
      

  3.   

    FEDERATED 存储引擎相当于在1.1上设置1.2的映像
      

  4.   

    示例:
    在host: 168.56.41.11建个FEDERATED 表 CREATE TABLE xxx_b ( 
        id    INT(20) NOT NULL AUTO_INCREMENT, 
        username  VARCHAR(32) NOT NULL DEFAULT '', 
        password  VARCHAR(32), 
        PRIMARY KEY  (id) 

    ENGINE=FEDERATED 
    CONNECTION='mysql://broot:[email protected]:3306/dbname/b表'; select * from xxx_b 就可以了
      

  5.   

    参考:
    http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#federated-storage-engine
      

  6.   

    如果更改存储引擎的代价太大的话,可以在程序里实现表的联结。
    方法很简单,先连接192.168.1.1,取出用where条件筛选后的一个表的数据;然后再连接192.168.1.2,取出用where条件筛选后的另一个表的数据;然后用程序语言实现联结~
      

  7.   


    如果192.168.1.1表里有10000条数据,192.168.1.2连接要执行查询多少次、
    你不可能把number_id赋值给数组,where条件给数组查吧、
      

  8.   

    创建FEDERAL存储引擎,然后直接做JOIN查询。
      

  9.   

    两个数据库分别只查询一次,用where筛选后的两个表的数据全部由应用程序缓存,在程序语言中用两个循环逐行比较:
    for(i=0;i<list1.size();i++){
      for(j=0;j<list2.size();i++){
        if(list1[i][id]==list[j][id]){
          取出list[i];
        } 
      }  
    }
      

  10.   

    呵呵,LZ误会了~
    我说用那个方法的前提是LZ不想更换存储引擎,如果两个数据表中的数据量很大,两个for循环的做法确实显得很笨,它只适合少量数据~
    在应用程序里解决联结问题,尤其是不同数据库服务器之间表的联结问题,在特定情形下,是比较通用且高效的方法,不但锁定的时间更短,且检查的行也更少。
    下面举个分解联结(Join Decomposition)例子(引自高效MySQL):
    mysql> SELECT * FROM tag
    -> JOIN tag_post ON tag_post.tag_id=tag.id
    -> JOIN post ON tag_post.post_id=post.id
    -> WHERE tag.tag='mysql';
    分解后你可能需要执行这三条语句:
    mysql> SELECT * FROM tag WHERE tag='mysql';
    mysql> SELECT * FROM tag_post WHERE tag_id=1234;
    mysql> SELECT * FROM post WHERE post.id in (123,456,567,9098,8904);
      

  11.   

    你的数据库在不同服务器,只能通过在其中的一台创建一个表的LINK,也就是一直讲到的FEDERA存储引擎,并不是让你去更改原数据库上的引擎。 建议楼上认真看一下别人的回复。
      

  12.   

    以PHP为例:
    $connect1=mysql_connect($host1,$user1,$password1);
    $connect2=mysql_connect($host2,$user2,$password2);
    $result1=mysql_query($sql1,$connect1);
    $result2=mysql_query($sql2,$connect2);
      

  13.   

    1.1 建一个FED表,指向1.2,并命名为fed_number然后用view或者直接select * from number -- 192.168.1.1
    union all
    select * from fed_number -- 192.1.68.1.2
      

  14.   

    楼主还没有明白吗?
    比如连接1.1的MYSQL,在其中安装FEDERA存储引擎,建立FED表,上面已经有示例,
    在1.1中用SQL语句查询即可,与在1.1中的表没有区别
      

  15.   

    在1.1建立一个FED表为fed_number
    然后连接1.1
    然后执行如下SQL
    select * from customer join fed_number on customer.number_id=fed_number.id是上面的意思吧
    只要这样肯定行呗
      

  16.   

    分库一般都是按照一定规则的。
    1 不同库的数据,很少需要,或者尽量避免实时同时统计。
    2 分库一定有规则,或按模块,或按时间,或按地域,或按ID(之hash),不太可能存在不确定哪个库的情况
    3 由于规则1,加上缓存等帮助,相关统计、查询可以考虑在程序端完成,此难度取决于当初分库设计之优良与否(2)
      

  17.   


    ERP系统、一个总公司数据库、存相关信息。
    分公司数据库总数不确定,有可能客户业务拓展,在各地进行开分公司,代理网点
    每个分公司都有相同的表,存部分信息,总公司看到的,为选择哪个地方的分公司,自动关联相关表连接
    你可能会分公司不固定,怎么判断连接。。数据库可以多备份一个字段、、
    如果新加一个分库、只需要在总库表中字段添加就行。
    所以group by 字段、、有多少就是多少,相当于无限
    你告诉我你要在总库手动映射多少个表
      

  18.   

    可以使用Sqlserver的链接服务器功能,你google一下应该可以帮助到你。