以下CodeIgniter查询会出错;
SELECT列表的表达式#22不在GROUP BY子句中并且包含 非聚集列'hw3.1.hw_homework.id',它不是功能上的 依赖于GROUP BY子句中的列;这是不相容的 的sql_mode = only_full_group_by
SELECT *, `studentid`, COUNT(studentid), `be_user_profiles`.`first_name`, `be_user_profiles`.`last_name` FROM `be_user_profiles` JOIN `be_users` ON `be_users`.`id`=`be_user_profiles`.`user_id` JOIN `hw_homework` ON `be_user_profiles`.`user_id`=`hw_homework`.`studentid` WHERE `be_user_profiles`.`advisor` = '20' AND `hw_homework`.`date` < '2018-06-15 00:00:00' AND `hw_homework`.`date` > '2017-08-24 00:00:00' AND `active` = 1 GROUP BY `be_user_profiles`.`user_id` ORDER BY COUNT(studentid) DESC
文件名:modules / organization / models / Mhomework.php
行号:226
$this->db->select('*,studentid,COUNT(studentid),be_user_profiles.first_name,be_user_profiles.last_name');
$this->db->from('be_user_profiles');
$this->db->join('be_users','be_users.id=be_user_profiles.user_id');
$this->db->join('hw_homework','be_user_profiles.user_id=hw_homework.studentid');
$this->db->where('be_user_profiles.advisor',$id);
$this->db->where('hw_homework.date <',$to);
$this->db->where('hw_homework.date >',$from);
$this->db->where('active',1);
$this->db->group_by('be_user_profiles.user_id');
$this->db->order_by('COUNT(studentid)','DESC');
$query = $this->db->get();
我删除了studentid
或添加了group_by studentid等,但没有一个有效。
我知道我可以设置全局SQL模式,但我认为它不适合我。
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
我想修复代码而不是解决方法。
答案 0 :(得分:2)
在标准SQL中,在SELECT *
的查询中使用GROUP BY
非常困难。为什么?标准SQL要求SELECTEed列也出现在GROUP BY子句中,对于具有在功能上依赖于GROUP BY中提到的值的列的一些例外。
要编写聚合查询,最简单的方法是在SELECT中枚举所需的列,并再次在GROUP BY中枚举。 MySQL的notorious nonstandard extension to GROUP BY
允许您询问GROUP BY
子句中未提及的列,并继续为这些列返回一些不可预测的值。
要修复这个“正确”而不是破解它,你需要摆脱*
。改变
$this->db->select('*,studentid,COUNT(studentid),be_user_profiles.first_name,be_user_profiles.last_name');
到
$this->db->select('studentid,COUNT(studentid),be_user_profiles.first_name,be_user_profiles.last_name');
并且,为了获得最佳效果,请更改
$this->db->group_by('be_user_profiles.user_id');
到
$this->db->group_by('studentid,be_user_profiles.user_id');