发生数据库错误错误号:1055

时间:2017-09-12 11:24:02

标签: php mysql codeigniter mysqli mysql-error-1055

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

错误号码:1055

  

SELECT列表的表达式#23不在GROUP BY子句中,并且包含非聚合列'zipbizzlatestdb.pia.id',它在功能上不依赖于GROUP BY子句中的列;这与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;
}

不知道如何解决此错误

3 个答案:

答案 0 :(得分: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
  

请注意窗口os

答案 1 :(得分:0)

在阅读SQL时,你要求返回每一列(即*),以及第二次返回id(o.id已经被*检索),然后你要查询 GROUP_CONCAT(pia.applicantid)即可。但是,您的小组仅按条款请求按(分组)o.id进行汇总。

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

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

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

答案 2 :(得分:0)

这对我有用:

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

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