[PHP]-Laravel中Group By引发的问题思考

news2024/9/22 9:47:32

在这里插入图片描述

Laravel 和 ThinkPHP 是两个不同的 PHP 框架,它们在底层使用了相同的 SQL 查询语言来与数据库交互。然而,由于框架的设计和实现方式不同,它们在生成 SQL 查询时可能会表现出一些细微的差异,包括对
GROUP BY 子句的处理。

在调用查询公司在线报告接口时,发现我请求的数据室20条每页,但是经查询存在16,17条的都有,并且后几页也不稳定,就一直查询问题
报错信息:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'gabd3.a.conclusion' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

经查询由于mysql中sql_mode中包含:ONLY_FULL_GROUP_BY

1、在RDS控制台的参数设置页面,修改sql_mode参数取值,去掉ONLY_FULL_GROUP_BY条件,忽略GROUP BY的严格检查。修改方法
2、在程序代码中屏蔽该模式

解决方案如下几种:

1、在 Laravel 中手动设置 sql_mode (无效果,可尝试)

如果你不想在服务器级别禁用 only_full_group_by,可以在 Laravel 应用程序中手动设置 sql_mode,例如在 AppServiceProvider 中设置。

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        DB::statement("SET SESSION sql_mode=''");
    }
}

2、在查询业务代码中直接手动设置 sql_mode (无效果,可尝试)

DB::statement("SET SESSION sql_mode= ''");

3、阿里云RDS中参数设置为空,如果其他mysql服务可以my.ini中配置修改 (无效果,可尝试)


配置 my.cnf 文件,确保 sql_mode 设置正确
确保在 MySQL 的配置文件中(如 my.cnf 或 my.ini),sql_mode 参数已正确设置为空或不包含 only_full_group_by。

步骤:
编辑 MySQL 配置文件(通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf)。

找到 sql_mode 设置,确保 only_full_group_by 没有被包含:

[mysqld]
sql_mode=""
保存文件并重启 MySQL 服务:

sudo systemctl restart mysqld

验证mysql中参数设置,查询sql_mode

SELECT @@global.sql_mode
show variables like 'sql_mode%'

4、检查 SQL 查询本身

确保在使用 GROUP BY 时,所有非聚合列要么包含在 GROUP BY 中,要么在 SELECT 语句中被聚合处理。

由于我的业务要求,不能使用聚合函数处理查询的数据字段。

例如,聚合处理如下的查询:

$results = DB::table('users')
    ->select('name', DB::raw('COUNT(*) as total'))
    ->groupBy('name')
    ->get();

确保所有在 SELECT 中的非聚合字段(如 name)都包含在 GROUP BY 子句中。

5、数据库连接时覆盖 SQL_MODE(有效)

在 Laravel 中,你可以通过配置文件 config/database.php 中的 mysql 连接配置选项中显式地设置 sql_mode。

database.php中配置strict模式为false ,然后执行 php artisan config:cache ,就解决


'gene' => [
    'driver'         => 'mysql',
    'url'            => env('DATABASE_URL'),
    'host'           => env('DB_GENE_HOST', '127.0.0.1'),
    'port'           => env('DB_GENE_PORT', '3306'),
    'database'       => env('DB_GENE_DATABASE', 'forge'),
    'username'       => env('DB_GENE_USERNAME', 'forge'),
    'password'       => env('DB_GENE_PASSWORD', ''),
    'unix_socket'    => env('DB_GENE_SOCKET', ''),
    'charset'        => 'utf8mb4',
    'collation'      => 'utf8mb4_unicode_ci',
    'prefix'         => '',
    'prefix_indexes' => true,
    'strict'         => false,
    'engine'         => null,
    'options'        => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],
        

Thinkphp框架

$data = Db::table('hd_user_rep_inherit')->alias('a')
    ->join('hd_com_inherit b', 'a.did = b.did and b.isshow > 0')
    ->join($table, 'b.did = c.did')
    ->join('hd_com_locinfo d', 'c.locid = d.locid')
    ->where([
        ['a.sid', '=', $sampleId],
        ['a.isshow', '=', 1],
        ['a.conclusion', '<>', -1],
    ])
    ->field('a.id,a.conclusion,a.result,b.chname,c.did,c.dis_inherit_type,c.inhert_type as inherit_type,d.gene_name')
    ->order('a.conclusion desc')
    ->group('c.did')
    ->select();

Laravel框架


DB::statement("SET SESSION sql_mode= ''");

 return DB::connection('gene')
        ->table('hd_user_rep_inherit as a')
        ->join('hd_com_inherit as b', 'a.did', '=', 'b.did', 'left')
        ->join($table, 'b.did', '=', 'c.did', 'left')
        ->join('hd_com_locinfo as d', 'c.locid', '=', 'd.locid', 'left')
        ->where([
            ['a.sid', '=', $sid],
            ['a.isshow', '=', 1],
            ['a.conclusion', '<>', -1],
            ['b.isshow', '>', 0]
        ])
        ->select('a.conclusion','b.chname','a.did','c.dis_inherit_type','c.inhert_type as inherit_type','d.gene_name')
        ->orderBy('a.conclusion', 'desc')
        ->orderBy('a.did', 'asc')
        ->groupBy(['a.did'])
        ->paginate(20, ['*'], 'page', $page);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV学堂 | 汇总 | 深度学习图像去模糊技术与模型

本文来源公众号“OpenCV学堂”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;汇总 | 深度学习图像去模糊技术与模型 引言 深度学习在图像去模糊领域展现出了强大的能力&#xff0c;通过构建复杂的神经网络模型&#xff0c;可以自…

基于 html5 的图书管理系统--论文pf

TOC springboot532基于 html5 的图书管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和…

ansible[自动配置]

回顾 1、mysql和python &#xff08;1&#xff09;不需要执行mysql_ssl_rsa_setup &#xff08;2&#xff09;Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql &#xff08;1&#xff09;connpymysql.connect(host,user,password,database,prot)…

您需要知道的:大模型中的算力精度FP16 vs. FP32

正如海洋中的巨浪需要广阔的海域来形成&#xff0c;大模型的算力需求也要求我们拓宽对现有计算资源的认识。接下来的内容将引导我们穿越技术的波涛&#xff0c;探索在人工智能快速发展的今天&#xff0c;算力如何成为推动进步的关键力量。我们将分析FP16与FP32精度选择的权衡&a…

【一文详解】内外网文件摆渡系统如何搭建安全数传通道?

内外网文件摆渡系统主要应用于做了隔离的内外网之间&#xff0c;或者多个网络&#xff08;比如生产网、测试网、办公网&#xff09;之间的文件数据传输&#xff0c;涉及的行业主要包括集成电路、金融、电力、能源、医院、高新技术、新能源、科研机构、生物医药等&#xff0c;内…

2024秋招Java 面试必刷的1200 道Java大厂面试真题(含答案解析)

2024秋招即将来临&#xff0c;很多同学会问 Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度…

Ubuntu网络服务无法启动问题

问题 Ubuntu20.04卡死重启后网络服务打不开&#xff0c;没有下图中的有线一栏&#xff1a; 查看网络服务状态如下&#xff1a; systemctl status NetworkManager此时桌面右上角没有下图中网络图标&#xff1a; 解决 命令&#xff1a; sudo service network-manager sto…

Golang | Leetcode Golang题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; func intersect(nums1 []int, nums2 []int) []int {sort.Ints(nums1)sort.Ints(nums2)length1, length2 : len(nums1), len(nums2)index1, index2 : 0, 0intersection : []int{}for index1 < length1 && index2 < length2 {i…

Unity的地编系统

目录 基础操作与流程&#xff1a; 模型和材质制作&#xff1a; 六边形地图系统&#xff1a; 无缝大地图实现&#xff1a; 插件与扩展功能&#xff1a; 导航与寻路系统&#xff1a; 案例教学与视频教程&#xff1a; 技术问答与社区支持&#xff1a; Unity地编系统中如何…

基于RIFE的光流估计

文章目录 概要权重下载光流估计结果预览 概要 RIFE&#xff0c;一种用于视频帧插值&#xff08;VFI&#xff09;的实时中间流估计算法。许多最近基于流动的VFI方法首先估计双向光流&#xff0c;然后将它们缩放和反转为近似的中间流&#xff0c;从而导致运动边界和复杂管道上的…

Python之海龟绘图绘制国旗

海龟绘图绘制国旗 步骤&#xff1a; 背景底色大五角星5个小五角星 import turtle#1. draw_rectangle 函数用于绘制矩形&#xff0c;用于国旗的背景。 def draw_rectangle(color, x, y, width, height):turtle.penup()turtle.goto(x, y)turtle.pendown()turtle.color(color)tu…

如何量化管理研发团队的技术债务?

在探讨技术债的成因之前&#xff0c;我们需要澄清一些关于技术债起因和本质的普遍误解。 误解一&#xff1a;技术债务等同于劣质代码 那么&#xff0c;什么构成了所谓的「劣质代码」&#xff1f; 所谓的好代码&#xff0c;可能是指那些整洁、不会在未来限制你决策的代码&…

LearnOpenGL——法线贴图、视差贴图学习笔记

LearnOpenGL——法线贴图、视差贴图学习笔记 法线贴图 Normal Mapping一、基本概念二、切线空间1. TBN矩阵2. 切线空间中的法线贴图 三、复杂模型四、小问题 视差贴图 Parallax Mapping一、基本概念二、实现视差贴图三、陡峭视差映射 Steep Parallax Mapping四、视差遮蔽映射 P…

HexView 刷写文件脚本处理工具-命令行介绍(四)-地址范围缩减(/AR:‘range‘)

地址范围缩减(/AR:‘range’) 此选项可以限制加载到内存中的数据范围。 如果只想在 HexView 中处理数据的缩减范围,这将非常有用。 通过其块开始地址和长度来指定地址范围,地址和长度由逗号分隔。也可以使用开始地址和结束地址来指定范围。 然后,这两个值必须由‘-’分…

继承的多种方式

1. 原型链继承 function Parent() {this.name "xiaohong"; } Parent.prototype.getName function () {console.log(this.name); };function Child() {}Child.prototype new Parent();const child new Child(); child.getName(); console.log(child.name);引用类…

带你速通C语言——指针(10)

指针是C语言中最强大但也最容易引起困惑的概念之一。它们直接关联内存管理&#xff0c;使得程序员可以高效地操作数据和内存。下面我将尽量以简单明了的方式介绍指针的基本概念。 1.指针基础 指针本质上是存储内存地址的变量&#xff0c;这个地址指向一个值。通过指针&#xf…

STM32 PWR电源控制 与 低功耗模式 详解

目录 STM32 PWR电源控制 与 低功耗模式 详解 1. PWR 电源控制 简介 2. PWR 电源控制 框图 3. 上电复位和掉电复位 与 可编程电压检测器&#xff08;PVD&#xff09; 3.1 内嵌复位与电源控制模块特性图 3.2 上电复位和掉电复位 3.3 可编程电压检测器&#xff08;PVD&…

蚁群算法原理与实战(Python、MATLAB、C++)

蚁群算法 1.蚁群算法来源 蚁群算法&#xff08;Ant Colony Optimization&#xff0c;简称ACO&#xff09;是一种模拟自然界中蚂蚁寻找食物路径行为的优化算法&#xff0c;主要用于解决组合优化问题。它的灵感来源于意大利学者Marco Dorigo在1992年提出的蚂蚁系统模型。 蚁群算…

脑网络相似性:方法与应用

摘要 图论方法已被证明是理解、表征和量化复杂大脑网络的有效工具。然而&#xff0c;定量比较两个图形的方法却较少受到关注。在一些网络神经科学应用中&#xff0c;比较大脑网络确实是必不可少的。在这里&#xff0c;本研究讨论了近年来用于比较大脑网络的技术现状、挑战以及…

Android常见界面控件(二)

目录 前言 一、 RadioButton控件 设置RadioGroup的监听事件 二、CheckBox控件 三、Toast类 改变Toast窗口的提示位置 前言 在上一篇中&#xff0c;我们讲解了三个常见的控件&#xff1a;TextView控件、Button控件、ImageView控件&#xff0c;那么本篇我们就接着讲剩下的…