首页 > 编程语言 >PHP 通过创建临时表实现更高速的IN查询

PHP 通过创建临时表实现更高速的IN查询

时间:2023-04-07 15:47:36浏览次数:30  
标签:insert name 创建 t1 查询 field PHP tb

/**
 * xmsb_fastIn 通过创建临时表实现更高速的IN查询
 * @return array
 */
function xmsb_fastIn
(
    $tb_name,               // 要执行in查询的表名
    $field_name,            // 要执行in查询的字段名
    $data_array,            // in查询的条件数据集
    $not_in = false,        // 为true时,将执行NOT IN查询
    $field_type = 'INT',    // in查询的数据集字段类型,默认为:INT
    $field_length = '11'    // in查询的数据集字段长度,默认为:11
)
{
    if(empty($tb_name) || empty($data_array))
    {
        return [];
    }
    
    // 连接数据库
    $dsn = 'mysql:host=host;dbname=dbname';
    $username = 'username';
    $passwd = 'password';
    $pdo = new PDO($dsn, $username, $passwd);
    
    // 定义临时表名
    $tmp_tb = uniqid('xmsb_', true);
    
    // 创建临时表
    $create = <<<xmsb
CREATE TEMPORARY TABLE `{$tmp_tb}` (
    `{$field_name}` {$field_type}({$field_length}) NOT NULL,
    INDEX `temp_index`(`{$field_name}`) USING BTREE
);
xmsb;
    $pdo -> exec($create);
    
    // 将数据分组进行批量插入
    $datas = array_chunk($data_array, 500);
    foreach($datas as $v)
    {
        $insert = "INSERT INTO `{$tmp_tb}` (`{$field_name}`) VALUES";
        foreach($v as $vv)
        {
            $insert .= " ({$vv}),";
        }
        $insert = trim($insert, ',');
        $pdo -> exec($insert);
    }
    
    // 生成查询语句
    if($not_in)
    {
        $sql = "SELECT t1.* FROM `{$tb_name}` t1 LEFT JOIN `{$tmp_tb}` t2 ON t1.`{$field_name}` = t2.`{$field_name}` WHERE t2.`{$field_name}` IS NULL";
    }
    else
    {
        $sql = "SELECT t1.* FROM `{$tb_name}` t1 INNER JOIN `{$tmp_tb}` t2 ON t1.`{$field_name}` = t2.`{$field_name}`";
    }
    
    // 获取查询结果并返回
    $query = $pdo -> query($sql);
    $res = [];
    while($row = $query -> fetch(PDO::FETCH_ASSOC))
    {
        $res[] = $row;
    }
    
    return $res;
}

 

标签:insert,name,创建,t1,查询,field,PHP,tb
From: https://www.cnblogs.com/XiaoMingBlingBling/p/17296371.html

相关文章

  • PHPCMS粘贴图片自动上传到服务器(Java版)
    ​ 这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@     page contentType="text/html;cha......
  • EAS使用网络互斥锁,查询互斥锁
    互斥锁id可以查询表 T_BAS_DataUpdateMutexselect*fromT_BAS_DataUpdateMutex没有用户参数时可使用以下//增加网络互斥IMutexServiceControliMutex=MutexServiceControlFactory.getLocalInstance(ctx);StringbillId=null;try{......
  • 直播app开发,使用koa和MongoDB实现分页和模糊查询
    直播app开发,使用koa和MongoDB实现分页和模糊查询1.分页per_page:一页多少条数据page:第几页 //index.jsconstKoa=require('koa')constapp=newKoa()constRouter=require('koa-router')constusersRouter=newRouter({prefix:'/users'})//MongoDB数据库Us......
  • PHP随机生成指定时间段的指定个数时间
    一、生成某个范围内的随机时间 /***生成某个范围内的随机时间*@param<type>$begintime起始时间格式为Y-m-dH:i:s*@param<type>$endtime结束时间格式为Y-m-dH:i:s*@param<type>$now是否是时间戳格式为Boolean*/function......
  • [记录]php url传参json json_decode 后 null
    从APP端或从其他页面post,get过来的数据一般因为数组形式。因为数组形式不易传输,所以一般都会转json后再发送。本以为发送方json_encode(),接收方json_decode(),就解决的问题,结果发现,json_decode()后是NULL。一般会反应是少了一个参数“true”,但是回去看就是 json_decode($data,tru......
  • Azure OpenAI入门(一):创建Azure OpenAI服务与模型
    1.    打开Powershell,输入azlogin登录到Azure订阅。需要先安装AzureCLI,如果没安装请在https://learn.microsoft.com/zh-cn/cli/azure/?view=azure-cli-latest完成安装。 2.    用如下命令选择Azure订阅azaccountset--subscription <yoursubscriptionname>3. ......
  • easy excel 分页查询数据并上传文件服务器返回链接
    背景之前看到公司的excel下载是先分页查询再上传到obs(华为云服务器),最后返回链接的,最近在学习easyexcel特意记录一下。目的实现easyexcel分页查询数据并上传文件服务器返回链接参考链接这里实现代码点击查看代码@GetMapping("downloadOssUrl")@ResponseBody......
  • SQL SERVER查询每组最后一条数据
    现有表如下:  需要查询每一个item对应的最后一条数据,SQLSERVER如下:  SELECT*FROM(SELECTROW_NUMBER()OVER(PARTITIONBYItemCodeORDERBYRecordIDdesc)asRowNum,*fromRSItemCostChange)asHwhereH.RowNum=1ORDERBYItemCode ......
  • 使用SQL语句创建数据库表
    为维护数据库的完整性,数据库管理系统必须能够实现如下功能:提供定义完整性约束条件的机制提供完整性检查的方法进行违约处理所以我们要使用规范的SQL语句来创建数据库表:在建表时声明主关键字和外关键字的约束名被参照表中的列必须是该表中的主关键字组成部分,否则ORACLE将......
  • Ubuntu创建用户-注意事项
    1、shell工具登陆后会有很多信息:修改/etc/pam.d/sshd和/etc/pam.d/login文件中的有pam_motd.so的行注释掉#sessionoptionalpam_motd.somotd=/run/motd.dynamicnoupdate#sessionoptionalpam_motd.so#[1]再次ssh,这次没有了上面的update等信息了......