Mysql 如何实现多张无关联表查询数据并分页


Posted in MySQL onJune 05, 2021

Mysql 多张无关联表查询数据并分页

功能需求

在三张没有主外键关联的表中取出自己想要的数据,并且分页。

数据库表结构

水果表:

Mysql 如何实现多张无关联表查询数据并分页

坚果表:

 Mysql 如何实现多张无关联表查询数据并分页

饮料表:

Mysql 如何实现多张无关联表查询数据并分页

数据库随便建的,重在方法。

主要使用UNION ALL 操作符

UNION ALL 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION ALL内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同 ; 另外,UNION ALL结果集中的列名总是等于 UNION ALL中第一个 SELECT 语句中的列名。

// 详细sql语句
select * FROM
(
	(select fid,fname,price,type from fruits)
	UNION ALL
	(select nid,name,price,6 as type from nut)
	UNION ALL
	(select did,dname,price,7 as type from drinks)
	
) as fnd limit 0,10     -----fnd为表的别名

最终结果

Mysql 如何实现多张无关联表查询数据并分页

mysql多表联合查询时出现的分页问题的解决

mysql一对多分页问题

部门表:tbl_dept

员工表:tbl_emp

数据库sql文件

CREATE DATABASE /*!32312 IF NOT EXISTS*/`ssm-crud` /*!40100 DEFAULT CHARACTER SET utf8 */;
 
USE `ssm-crud`;
 
/*Table structure for table `tbl_dept` */
 
DROP TABLE IF EXISTS `tbl_dept`;
 
CREATE TABLE `tbl_dept` (
  `dept_id` int(11) NOT NULL AUTO_INCREMENT,
  `dept_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
 
/*Data for the table `tbl_dept` */
 
insert  into `tbl_dept`(`dept_id`,`dept_name`) values 
(1,'技术部'),
(2,'业务部'),
(6,'销售部'),
(7,'人事部');
 
/*Table structure for table `tbl_emp` */
 
DROP TABLE IF EXISTS `tbl_emp`;
 
CREATE TABLE `tbl_emp` (
  `emp_id` int(11) NOT NULL AUTO_INCREMENT,
  `emp_name` varchar(255) DEFAULT NULL,
  `emp_gender` char(1) DEFAULT NULL,
  `emp_email` varchar(255) DEFAULT NULL,
  `d_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`emp_id`),
  KEY `FK_tbl_emp` (`d_id`),
  CONSTRAINT `FK_tbl_emp` FOREIGN KEY (`d_id`) REFERENCES `tbl_dept` (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
 
/*Data for the table `tbl_emp` */
 
insert  into `tbl_emp`(`emp_id`,`emp_name`,`emp_gender`,`emp_email`,`d_id`) values 
(1,'xiaoshen','2',NULL,6),
(4,'晓明','1',NULL,1),
(5,'xiaohong','2',NULL,2),
(6,'xiaohei','2',NULL,6),
(7,'xiaozhang','1',NULL,1),
(8,'xiaogao','1',NULL,1),
(9,'xiaohua','1',NULL,1),
(10,'xiaoyan','2',NULL,1),
(11,'xiaohai','2',NULL,2),
(12,'xiaoqiang','1',NULL,6),
(13,'xiaoqi','2',NULL,7);

分页错误写法(主查询员工表)

SELECT * FROM tbl_emp e
LEFT JOIN 
tbl_dept d
 
ON d.dept_id  = e.d_id
 
LIMIT 1,10

使用子查询方式解决问题

SELECT
        *
    FROM
     (
       SELECT
       *
        FROM
        tbl_emp e
        LEFT JOIN 
    tbl_dept d
        ON d.dept_id  = e.d_id
        
        GROUP BY e.d_id
        LIMIT 1,10
 
     ) e
 
      LEFT JOIN tbl_dept d
        ON d.dept_id  = e.d_id

下面代码与之无关 仅为备份

SELECT
        ft.id,
        ft.partner_id AS partnerId,
        ft.code ,
        ft.end_update_date AS  endUpdateDate,
        ft.name ,
        ft.type ,
        ft.area ,
        ft.is_default AS  isDefault,
        fp.id fpId,
        fp.shop_id AS fpShopId  ,
        fp.provice_id AS fpProviceId ,
        fp.provice_name AS fpProviceName ,
        fp.start_num  AS fpStartNum ,
        fp.start_fee  AS fpStartFee ,
        fp.increase_num AS fpIncreaseNum ,
        fp.increase_fee AS fpIncreaseFee ,
        fp.code AS fpCode ,
        fp.provice_text AS  fpProviceText ,
        fp.template_id AS fpTemplateId
    FROM
     (
       SELECT
        f.id,
        f.partner_id ,
        f.code ,
        f.end_update_date  ,
        f.name ,
        f.type ,
        f.area ,
        f.is_default ,
        f.is_del,
        f.create_date
        FROM
        bus_freight_template f
        LEFT JOIN bus_freight_provice p
        ON f.id = p.template_id
        WHERE f.code = p.code
        AND f.code = #[code]
        GROUP BY f.id
        LIMIT #{startPage},#{pageSize}
 
     ) ft
 
      LEFT JOIN bus_freight_provice fp
        ON ft.id = fp.template_id
    WHERE ft.code = fp.code
      AND fp.template_id IS NOT NULL
      AND ft.code =  #[code]
      AND fp.is_del = '0'
      AND ft.is_del = '0'
 
      order by ft.create_date desc

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

MySQL 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
Mysql 性能监控及调优
Apr 06 MySQL
MySQL 重命名表的操作方法及注意事项
May 21 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
MYSQL 运算符总结
Nov 11 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
Mysql中存储引擎的区别及比较
浅谈mysql返回Boolean类型的几种情况
Jun 04 #MySQL
Mysql 设置boolean类型的操作
Jun 04 #MySQL
MySQL中的布尔值,怎么存储false或true
mysql外连接与内连接查询的不同之处
Mysql systemctl start mysqld报错的问题解决
Jun 03 #MySQL
你知道哪几种MYSQL的连接查询
Jun 03 #MySQL
You might like
php minixml详解
2008/07/19 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
多广告投放代码 推荐
2006/11/13 Javascript
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
sails框架的学习指南
2014/12/22 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
js实现随机抽奖
2020/03/19 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
Python中的time模块与datetime模块用法总结
2016/06/30 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
PHP面试题集
2016/12/18 面试题
神路信息Java面试题目
2013/03/31 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
计算机专业毕业生求职信分享
2013/12/24 职场文书
行政求职信
2014/07/04 职场文书
小学数学教学反思范文
2016/02/16 职场文书