功能需求

首先要理解原始需求是什么,为什么要跨库join。举个简单的例子,在日志数据库log_db有一份充值记录表pay_log,里面的用户信息只有一个userid;而用户的详细信息放在主库main_db,里面有用户的详细信息表user_info,如用户名、登录时间、注册时间、会员等级 等等。如果只是按用户名查找充值记录,那可以很简单地分两次查询即可。但是更复杂的需求,比如按注册时间排序,按会员等级统计等等,稍微复杂一点的功能,分次查询就相当难以做到了。如果在同一个库里,我们可以很方便的使用join关键字实现这些功能,但是在不同的数据库里,并没有跨库查询的SQL JOIN语句。那怎么办呢?

方案一、字段冗余。也就是说把一部分信息重复存放,比如 pay_log表里除了userid字段还有user_name字段,等等。但是这只适合加少量字段,如果把注册、登录时间、等级等等都字段都重复一遍,那是显然不科学的。

方案二、表复制和同步。也就是说把main_db里面的user_info表复制一份到log_db中,然后设置定时任务让这两个表进行同步。这样确实是可以在一个库里,然后可以进行 JOIN 等的复杂语句操作了。但是这两个表的内容是重复的,未免会比较浪费空间。

方案三、链接表。什么是链接表呢?简单来说,就是在log_db里有一个user_info表,但这个表并没有存储数据,而是直接链接到了 main_db里的user_info表。这样的话,我们可以既无需定期同步,又可以像在同一个库里使用JOIN等操作。

开启 FEDERATED 引擎

以MySQL为例,链接表与常见的 MyISAM, InnoDB 等等,都是一种表的结构类型(称之为 存储引擎)。使用 show engines; 命令即可看到数据库所支持的存储引擎,默认 FEDERATED 引擎 是关闭的,我们需要去mysql配置文件开启它。

开启的方法很简单,在windows下只需要在mysql的配置文件 my.ini 最末尾加上一句 federated ,然后重启mysql即可。重启后输入 show engines;命令即可看到 FEDERATED 的 Support 变为 YES,表示federated引擎已经开启。

新建链接表(federated引擎的表)

既然是链接的表,那么会有以下几个限制:

1.本地的表结构必须与远程的完全一样

2.远程数据库目前仅限MySQL

3.不支持事务

4.不支持表结构修改

建表的语句如下

CREATE TABLE xxx(...) ENGINE=FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]'

当然不建议这样自己手工从头拼装SQL语句,可以把mian_db的user_info表的结构导出来,然后修改最后的半句,再导进去就行啦。建表语句示例如下:

CREATETABLE `user_info` (`userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',`username` varchar(60) NOT NULL DEFAULT '' COMMENT '帐号',`level` int(11) NOT NULL DEFAULT '1' COMMENT '等级',`log_dt` timestamp NOT NULL DEFAULT '2016-11-30 00:00:00' COMMENT
'最后登录时间',`reg_dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',PRIMARY KEY (`userid`),KEY `idx_name` (`username`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
CONNECTION='mysql://batsing:b8a7t4@localhost:3306/main_db/user_info'
COMMENT='用户基本信息表-链接表';

经过这些步骤,我们就把另外一个库的表,链接到了我们操作的库上了。这样就可以使用JOIN等语句,间接进行跨库操作啦

实现数据库的跨库join联表查询相关推荐

  1. 用php进行联查,Thinkphp使用join联表查询的方法

    本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...

  2. php tp5的联表查询,Thinkphp使用join联表查询的方法

    本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...

  3. mycat 跨库间连表查询解决方案

    文章目录 一.应对场景 二.解决方案 三.效果 四.实现 1. 过程概述 2. 建库.建表.插数据.创建视图 3. 配置 mycat 的 schema.xml 4. 测试 navicat直接测试 ja ...

  4. MySql 你知道什么情况下适合使用Join 联表查询吗 ?

    志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...

  5. 微信小程序云开发云数据库_聚合操作_联表查询_对象数组某字段与另一集合的某字段相等匹配

    目录 表结构 需求 Aggregate.unwind 查询操作代码 查询结果 表结构 错题表 wrong 单选题表 single 需求 连接错题表和单选题表,筛选出错题的题目ID.题目.答案.解析.用 ...

  6. 联表查询JOIN介绍

    大家好,因为最近项目里面涉及多张表,会使用到很多联表查询,所以今天给大家分享一下联表查询里面的JOIN的相关知识. 一.背景介绍 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中, ...

  7. 不要做联表查询!!!

    一直想要聊一聊关于开发中更建议使用单表查询+代码层组装 or 联表查询 的问题,在开发中每个同学的开发中有各自的习惯. 对比 在实际开发中,我们不可避免的要关联几张数据表来合成最终的展示数据,如: s ...

  8. 为什么强烈建议你不要做联表查询?

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 前言 一直想要聊一聊关于开发 ...

  9. 单表查询or联表查询

    在实际开发中,我们不可避免的要关联几张数据表来合成最终的展示数据. 常见的做法一般有两种: a,联表查询 b,单表查询+业务层组装 联表查询 select *from sys_user uleft j ...

最新文章

  1. python urllib.request 爬虫 数据处理-Python爬虫学习之(二)| urllib进阶篇
  2. 跨链Cosmos(10) IBC接口
  3. css 让div 的高度和屏幕的高度一样
  4. 将IDEA工程代码提交到Github
  5. Hadoop(MapR)分布式安装及自动化脚本配置
  6. 安装配置Eclipse开发PHP环境配置
  7. 2019游戏 f1_2019年F1中国大奖赛激情开跑,这款手游带你体验真实F1的魅力
  8. Google+ 为什么会死?
  9. Linux下不同颜色文件的类型
  10. Mac 基本教程和vim + Awesome Mac
  11. ei指什么_SCI、EI、SSCI、CSSCI分别是指什么
  12. magedu.N45019第一周作业
  13. day11_rabbitmq和redis
  14. 腾讯优图开源项目TNN总结与实践
  15. Android 蓝牙知识
  16. 【医学图像处理】9 二值形态学
  17. Ext JS从零开始之二
  18. 如何保护您的域名系统免遭劫持
  19. oracle修改open_cursors,oracle open_cursors
  20. 两化融合主要在哪些方面

热门文章

  1. 配对堆Pairing Heap
  2. ubuntu系统根目录下各个目录用途说…
  3. 【软路由】J4125安装PVE7.3+iKuai+OpenWrt+NAS+Win10+Debian+CentOS
  4. linux解压z格式文件夹,使用7zip解决解压zip格式文件名乱码, 最简单的解决解压z...
  5. 用java程序编写原码补码转换_java 原码、反码、补码
  6. 使用python创建一个二维码生成器
  7. Screen.SetResolution 设置分辨率
  8. Python——特点(优点缺点)
  9. 腾讯王巨宏:拥抱开源是这个时代开发者应该具备的思维和能力
  10. R语言入门教程知识 第二章 赋值代码与命名规则