我创建了一个数据库视图,当我对此视图使用laravel分页时,它会抛出:
SQLSTATE[42000]: Syntax error or access violation: 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause (SQL: select count(*) as aggregate from `parameter_log_site_detail` where `site_id` = EPE)
但是此错误仅在实时服务器中弹出。分页在本地服务器上运行良好。
数据库视图: (parameter_log_site_detail)
select `t`.`site_id` AS `site_id`,cast(`t`.`logged_at` as date) AS `logged_on`,`t`.`daily_generation` AS `daily_generation`,`t`.`reading` AS `tot_reading` from `parameter_log_tab` `t` order by cast(`t`.`logged_at` as date) desc
型号:
public function scopeSiteDailyReadings($query)
{
return $query->from('parameter_log_site_detail');
}
控制器:
$generations = EnergyGeneration::siteDailyReadings()->where('site_id', $site_id)->orderBy('logged_on', 'desc')->paginate(15);
实时服务器信息
MySQL Server version: 5.6.37 - MySQL Community Server (GPL)
PHP version: 5.6.30
Laravel version: 5.4
本地服务器信息(正常运行的地方)
MySQL Server version: 5.7.19 - MySQL Community Server (GPL)
PHP version: 7.1.7
Laravel version: 5.4
有人可以解释一下这可能是什么原因吗?我读到了ONLY_FULL_GROUP_BY。但是无法弄清楚它是服务器版本为5.6的原因。*。
答案 0 :(得分:2)
可以在MySQL 5.6中设置SQL模式ONLY_FULL_GROUP_BY,但默认情况下不设置它(参见https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html)。
啊哈,我看到你的评论出现在上面,你已经确认在本地服务器(MySQL 5.7)上设置了ONLY_FULL_GROUP_BY。
我认为你在问题描述中有错误。如果本地服务器上有ONLY_FULL_GROUP_BY而实际服务器没有,则应该在本地服务器上获取错误,但不能在实时服务器上获取错误。
我建议您确保在开发中使用与您在生产中使用的版本相同的版本,并且还匹配相同的SQL模式。这样可以防止开发过程中的混乱。
我对PHP的版本提出了同样的建议。如果您在开发中使用一些新的PHP 7功能,然后部署到PHP 5.6实时服务器,它们将无法工作。
您描述的SQL应该没问题:
select count(*) as aggregate from `parameter_log_site_detail` where `site_id` = EPE
这实际上没问题,即使你有ONLY_FULL_GROUP_BY。在表中执行所有匹配行的select count(*)
当然是合法的。此查询不需要GROUP BY子句。
但是如果将聚合列与非聚合列混合,则会违反ONLY_FULL_GROUP_BY要求,因为非聚合列将不明确。
select id, count(*) as aggregate from ...
我想知道在准备查询之前,Laravel是否在您的选择列表中插入了额外的列。您必须启用MySQL查询日志才能确定。
我注意到在Laravel问题上有一些关于此错误的讨论:https://github.com/laravel/framework/issues/15232
该线程中的几个用户解决方案的解决方案是在Laravel config / database.php中设置'strict'=>false
。
但我敢打赌,根本原因是Laravel正在修改你的SQL查询。