tp5 分表+ 分页查询
参考原文
tp5 分表
https://www.cnblogs.com/panziwen/p/12667863.html
分表数据分页查询
https://blog.csdn.net/tdcqfyl/article/details/82466959
根据以上两篇大佬的文章,tp5 分表,并不难
1,这里采用的是mysql单独建一张“tb_article”表来获取自增ID
CREATE TABLE `tb_article` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`stub` char(1) COLLATE utf8_bin NOT NULL DEFAULT '',PRIMARY KEY (`id`),UNIQUE KEY `stub` (`stub`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
2,分表设置$rule分了3个表,建表tb_article_1,tb_article_2,tb_article_3,里面字段要一致,用来存放内容
CREATE TABLE `tb_article_1` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '文章id',`user_id` INT(11) NOT NULL COMMENT '作者id',`add_time` INT(10) DEFAULT NULL COMMENT '时间',`typeid` INT(1) DEFAULT NULL COMMENT '文章栏目 1财经 2娱乐 3体育',`title` varchar(155) NOT NULL COMMENT '文章标题',`content` text NOT NULL COMMENT '文章内容',PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='文章表1';
3,新建模型
<?php
namespace app\index\model;
use think\Model;
class Article extends Model
{
protected $table = 'tb_article';
private function getRule(){
return [
'type' => 'mod', // 分表方式
'num' => 3 // 分表数量
];
} //获取插入ID,根据ID来取模分表
public function getLastId(){
$data['stub']='a';
return $this->insertGetId($data, true);
}
public function saveData($data, $id){
return $this->partition(['id' => $id], "id", $this->getRule())->insert($data);
}
public function getArticleById($where, $field = "*", $id){
return $this->partition(['id' => $id], "id", $this->getRule())->where($where)->field($field)->select();
}
}
4,新建控制器
<?php
namespace app\index\controller;use think\Controller;
use app\index\model\Article as ArticleModel;
class Article extends Controller
{
//执行添加分表数据
public function articleAdd(){
$Article = new ArticleModel();
$id = $Article->getLastId();
$data = [
'id' => $id,
'user_id' => 10,
'add_time' => time(),
'typeid' => 3,
'title' => '这里是新闻标题',
'content' => '这里是新闻内容',
];
if($Article->saveData($data,$id)){
$this->success('文章添加成功!');
}
}
//根据id查询分表数据
public function getArticle(){
$id = input('id');
if($id){
$Article = new ArticleModel();
$news = $Article->getArticleById(['id'=>$id],'*',$id);
return json($news);
}
}
//删除分表数据,原理和查询相同,直接根据id执行删除就行
}
通过已上几个步骤,就能实现tp5的分表数据添加和简单的查询。
tp5 的分表数据分页查询上面
文章大佬也说明了。根据说明执行就好.也就是两个步骤:1,先去获取数据的id 2,根据获取的id直接获取数据
//新建控制器查询方法 public function getList(){$Article = new subModel(); //1, 先去获取相关数据的主键id 表名 主键id 要获取的字段 分表数量 条件$news = $Article->buildPartitionSql('car_article','id',$fields='',$num=3,$where=''); //2, 根据获取的主键id获取数据 表名 主键id id值 分表数量$newlist = $Article->buildPartitionListSql('car_article','id',$news,$num=3);var_dump($newlist); //输出的就是我们需要的数据}
//新建模型方法
/*** 构造获取总记录数及主键ID的sql子查询语句* @param $table 主表名称* @param $idKey 主键id字段名称* @param string $fields 其它字段名称,多个字段用英文逗号分隔* @param int $num 子表数量* @param string $where 查询条件* @return array*/ function buildPartitionSql($table,$idKey,$fields='',$num=3,$where='') {$offset=0; //分页数据,跟普通分页一样,直接传参就好$rows=9; //分页数据,跟普通分页一样,直接传参就好$countTable = [];$listTable = [];$fieldList = [$idKey];if ($fields) {$fieldList = array_merge($fieldList,explode(',',$fields));$fieldList = array_unique($fieldList);}$fieldStr = implode(',',$fieldList);for ($i = 0; $i < $num; $i++) {$countTable[] = sprintf('SELECT %s FROM %s_%s where 1=1 %s', $idKey, $table, ($i + 1), $where);$listTable[] = sprintf('SELECT %s FROM %s_%s where 1=1 %s', $fieldStr,$table, ($i + 1), $where);}$countTable = '( ' . implode(" UNION ", $countTable) . ') AS ' . $table;$listTable = '( ' . implode(" UNION ", $listTable) . ') AS ' . $table;$tables = ['countSql' => $countTable, 'listSql' => $listTable];//这里返回的是两个sql语句,咱们简单点直接执行好,返回的就是数据的主键idreturn Db::query("select * from". $tables['listSql']. " limit ".$offset.",".$rows);//return $tables; } /*** 构造获取指定id对应记录的sql子查询语句* @param $table 主表名称* @param $idKey 指定的id字段名称* @param $idValues 指定的id字段值* @param int $num 子表数量* @return string*/ function buildPartitionListSql($table,$idKey,$idValues,$num=1) {$idValues=array_column($idValues,'id');$sql = '';$ids = is_array($idValues) ? implode(',',$idValues) : $idValues;if ($ids) {$listTable = [];for ($i = 0; $i < $num; $i++) {$listTable[] = sprintf('SELECT * FROM %s_%s where %s in (%s)', $table, ($i + 1), $idKey, $ids);}$sql = '( ' . implode(" UNION ", $listTable) . ') AS ' . $table;} //这里返回的是获取数据的失sql语句,简单点,直接执行就好,返回的就是我们需要的数据return Db::query("select * from". $sql." order by id");}
tp5 分表+ 分页查询相关推荐
- mysql分库分表分页查询语句_MySQL分库分表分库后的查询(8th)
前言 这边我们以使用python程序要展示一下再分库分表后,我们需要如何对数据库进行操作. python操作数据库 我们这边还是沿用之前的那5中:场景1:购买者下订单#!/usr/bin/env py ...
- mysql分片库分页查询_Mysql分库分表
一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...
- MySQL 跨库分页/ 分表分页/ 跨库分页,为什么这么难?
来源:https://www.cnblogs.com/yjmyzz/p/12149737.html 当业务数据达到一定量级(比如:mysql单表记录量>1千万)后,通常会考虑"分库分表 ...
- MySQL 跨库分页/ 分表分页,为什么这么难?
以下内容来自公众号逆锋起笔,关注每日干货及时送达 来源:https://www.cnblogs.com/yjmyzz/p/12149737.html 当业务数据达到一定量级(比如:mysql单表记录量 ...
- mysql多表联查分页_sqlserver多表联合查询和多表分页查询的代码讲解
sqlserver多表联合查询和多表分页查询的代码讲解 发布时间:2020-05-14 14:42:07 来源:亿速云 阅读:700 作者:Leah 这篇文章主要为大家详细介绍了sqlserver多表 ...
- mysql数据库分表及查询
垂直分表: 其实没啥好讲,就是 主键+常用列 放在原表中,再讲 主键+一些不常用列 放在另外的表中. 这样一个数据页就可以存放更多数据. 但是缺点也明显,可能会增加join 或 union之类的操作. ...
- MyBatis-Plus 初步使用心得-连表分页查询的实现
MyBatis-plus 是基于mybatis的增强工具,是一款稳定强大的工具. 配置安装参考:https://mp.baomidou.com/guide/install.html#release 经 ...
- MyBatis_Plus联表分页查询
MyBatis_Plus联表分页查询 当我们需要关联表格分页查询时,MyBatis_plus封装的单表方法已经满足不了我们的需求了,那么我们需要进行联表分页查询 假设我们需要的 SQL 语句如下: S ...
- mysql 分表 条件查询_mysql分表+查询
最近面试,问到关与mysql数据库的分表一些问题,如设计一个千万级别的会员数据库,当时想到了分表,但是当问到如何跟据username查询到用户的信息时,这时,有点卡住了,所以为了让自已重新认识分表,而 ...
最新文章
- (各种均衡算法在MIMO中的应用对比试验)最小均方误差(MMSE)原理推导以及在MIMO系统中对性能的改善。
- python语言中如何使用注释
- 2021.4.7 美团买菜后端开发实习生(二面)(含总结)(已oc)
- Matlab中与复数有关的函数abs()、angle()
- 三次元风景照秒变宫崎骏动画,还能把石原里美吉卜力化,AnimeGAN已开源
- 计算机视野仪检测青光眼的操作,计算机视野仪检测青光眼的操作及体会
- 当学术论文开始标题党「x is All You Need」
- CSS样式表书写位置
- poj2186【利用强连通分量】
- Nginx 项目部署和配置
- Java 分布式服务重复提交解决方案 Redis
- 17 CoCos Creator-Node Tree 层级管理器
- (孔乙己茴香豆的的“茴”字有几种写法)三栏布局两边固定中间自适应
- java最新2019面试题
- 海恩法则和费曼学习法
- python斗地主出牌算法_python模拟斗地主发牌
- 【常用代码03】去除a标签下划线
- 一个机器人,主要由哪几部分组成?
- Jmeter基本使用与常见性能瓶颈
- 关于mysql国庆头三天近一周的数据查询题目