发生数据库错误错误号:1055 [重复]

Posted

技术标签:

【中文标题】发生数据库错误错误号:1055 [重复]【英文标题】:A Database Error Occurred Error Number: 1055 [duplicate] 【发布时间】:2018-02-20 20:15:14 【问题描述】:

将数据库从 mysql 更改为 MySQLI 并收到错误 - 发生数据库错误

错误号:1055

SELECT 列表的表达式 #23 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列 'zipbizzlatestdb.pia.id';这与 sql_mode=only_full_group_by 不兼容

SELECT *,o.id as id, GROUP_CONCAT(pia.applicantid) as applicants 
FROM `pr_opportunity` as o 
    LEFT OUTER JOIN pr_internal_applicant as pia 
            ON o.id = pia.positionid 
WHERE o.approval_status='Approved' 
and DATE(o.deadline) > DATE(NOW()) 
GROUP BY o.id

文件名:/var/www/html/singlecodebase/Feb152017/models/mod_common.php

行号:6999

我的模型文件 mod_common 如下:

function get_opportunity_list()

    $sql = "SELECT *,o.id as id, GROUP_CONCAT(pia.applicantid) as applicants 
            FROM `".$this->myTables['opportunity']."` as o 
            LEFT OUTER JOIN pr_internal_applicant as pia 
            ON o.id = pia.positionid 
            WHERE o.approval_status='Approved' 
            and DATE(o.deadline) > DATE(NOW()) 
            GROUP BY o.id";
    $query=$this->db->query($sql);

    if($query->num_rows() > 0)
        $rows = $query->result();

           
    return $rows;

不知道如何解决这个错误

【问题讨论】:

Changed the database from mysql to mysqli 你的意思是你把mysql从5.6升级到5.7了吗? mysqlimysql_ 是与 mysql 交互的不同 PHP 驱动程序。 您可以尝试匹配查询中的() 括号 删除两个查询中的*,,它将起作用。如果您进行分组,则必须使用聚合函数(如 GROUP_CONCAT)或将您选择的列放入分组依据子句中。 一键安装phpmyadmin,运行数据库客户端版本:libmysql - mysqlnd 5.0.12-dev - 20150407,phpmyadmin vVersion信息:4.5.4.1deb2ubuntu2ersion。然后导入现有数据库 你需要看看你运行的是什么mysql版本,5.6和5.7处理group bys的方式不同。 【参考方案1】:

这对我有用:

打开http://localhost/phpmyadmin/,然后单击 SQL 并运行此查询:

    SET sql_mode = ''; SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

【讨论】:

这对我来说是 laragon mysql 5.7 的诀窍【参考方案2】:

它出现在mysql 5.7,因此请检查此链接 [https://www.sitepoint.com/quick-tip-how-to-permanently-change-sql-mode-in-mysql/] 并按照对我来说很好的步骤。

或者 打开文件

vi /etc/mysql/my.cnf

在文件底部添加这些行

[mysqld]
# ... other stuff will probably be here
sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

并保存 然后重启mysql

sudo service mysql restart

注意不适用于window os

【讨论】:

您按照步骤操作了吗 使用哪个操作系统? @VijaySharma 该页面是 404。最好使用主要来源,dev.mysql.com/doc/refman/5.7/en/group-by-handling.html。我也不会改变模式,最好更正查询。 @chris85 我更改了查询,但它对我不起作用,所以我使用它对我来说很好,是的,我知道最好更正查询而不是更改模式,谢谢您的建议。 @vijaySharma,您的解决方案似乎是一个完美的答案,我不想重写应用程序中的所有查询,这就是原因【参考方案3】:

在阅读您的 SQL 时,您要求返回每一列(即 *),以及第二次返回 id(o.id 已被 * 检索),然后您正在查询 GROUP_CONCAT(pia.applicantid)。但是,您的 group by 子句仅请求按 (group by) o.id 聚合。

SQL 不喜欢这样,因为它不知道如何处理数据集中使用 * 查询的其他字段。

我怀疑您希望以聚合方式查看与 o.id 相关的每个申请人 ID。如果是这样,这是您的查询,它将起作用。

SELECT o.id as id, GROUP_CONCAT(pia.applicantid) as applicants 
        FROM `".$this->myTables['opportunity']."` as o 
        LEFT OUTER JOIN pr_internal_applicant as pia 
        ON o.id = pia.positionid 
        WHERE o.approval_status='Approved' 
        and DATE(o.deadline) > DATE(NOW()) 
        GROUP BY o.id"

如果您想按其他字段分组,只需将它们专门添加到您的选择以及分组依据中即可。所有非聚合字段都需要在 select 和 group by 中。这是ANSI Standard 的一部分,所有SQL 风格都应该如此。我相信 mysql 5.7 及更高版本比以前的版本更注重这一点,但我通常会遵循这一点。

这里有一些关于该主题的补充阅读。希望这可以帮助。 MySQL 5.7 Documentation regarding Group by

【讨论】:

以上是关于发生数据库错误错误号:1055 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL错误1055

MySQL错误1055

MySQL5.7.25报1055错误解决方案

成功提交表单,但控制台出现一个错误,例如发生数据库错误错误号:1048 - Codeigniter

错误代码:1055 与 sql_mode=only_full_group_by 不兼容

试图获得每个州的总约会。在 MySQL 1055 中出现错误