TP框架 中 union 无法分页 报错SQLSTATE[HY000]: General error: 1221 Incorrect usage of UNION and LIMIT

本文讲述了如何在使用ThinkPHP的ORM进行多表联合查询时,避免SQLSTATE[HY000]:General error: 1221 Incorrect usage of UNION and LIMIT的问题。通过拆分查询条件并结合buildSql()方法,成功实现了跨表数据获取并实现了分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        $data['list']=Db::field('name')
            ->table('table1')
            ->union(function($query){
                $query->field('name')->table('table2');
            })
            ->union(function($query){
                $query->field('name')->table('table3');
            //->page($p, $pagesize)///////会报错//////
            ->select();

     报错:SQLSTATE[HY000]: General error: 1221 Incorrect usage of UNION and LIMIT

//////////////////////////////以下是解决办法////////////////////////////////////////
 $list1 = Db::field('name')->table('table1')->where($where1)->buildSql();
 $list2 = Db::field('name')->table('table2')->where($where2)->buildSql();
 $list3 = Db::field('name')->table('table3')->where($where3)->union([$list1,$list2,$list3])->buildSql();
        $data['list'] = Db::table( $list3.' a')
            ->field('name')
            ->page($p, $pagesize)
            ->select();

### 解析 MySQL 连接丢失问题 当遇到 `SQLSTATE[HY000]: General error: 2006 MySQL server has gone away` 错误时,这通常意味着 PHP 和 MySQL 之间的连接意外中断。此错误可以由多种因素引起,包括但不限于超时设置不当、网络配置不正确以及查询执行时间过长等问题。 #### 超时参数调整 为了防止因长时间运行的查询而导致的连接关闭,在 MySQL 配置文件 (`my.cnf`) 中增加以下两个变量可以帮助缓解该问题: ```ini wait_timeout = 28800 interactive_timeout = 28800 ``` 上述命令分别设置了交互式会话和非交互式会话的最大空闲时间为 8 小时[^4]。 #### 数据库连接池优化 对于频繁访问的应用程序来说,采用持久化连接或引入连接池机制能够有效减少重新建立连接所带来的性能损耗。在 Laravel 或者其他支持此类特性的框架内可以通过修改 `.env` 文件来启用持久化连接功能: ```bash DB_PERSISTENT=true ``` 此外,还可以考虑部署专门用于管理数据库连接的服务组件,比如 PGBouncer 对于 PostgreSQL, ProxySQL 则适用于 MySQL 环境下[^1]。 #### 查询语句优化 如果应用程序发送给 MySQL 的请求过于复杂或者涉及大量数据传输,则可能会触发服务器端的安全措施从而切断链接。因此建议审查并简化那些耗时较长的操作,分批次提交大批量的数据更新任务,并确保所有表结构都已创建合适的索引来加速检索过程。 #### 日志分析与监控工具集成 定期查看 MySQL 的慢查询日志和其他诊断信息有助于提前发现潜在的风险点。同时借助像 Prometheus + Grafana 组合这样的开源平台实现对整个系统的实时监测也十分必要,以便及时响应异常状况的发生[^2]。 ```sql SHOW VARIABLES LIKE 'slow_query_log%'; SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2; -- 设置超过两秒即记录为慢查询 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值