【问题标题】:SELECT list is not in GROUP BY clauseSELECT 列表不在 GROUP BY 子句中
【发布时间】:2020-03-17 17:37:14
【问题描述】:

我有两个pointages和chantiers表它们之间的belongsTo关系, 我想显示 chantiers 名称和每个 chantier 的销售总和我尝试了这个功能,但它给了我错误

$dataP = DB::table('chantiers')
         ->leftJoin('pointages','pointages.chantier_id','chantiers.id')
          ->selectRaw('COALESCE(SUM(pointages.sold),0) as sold,chantiers.chantier')
          ->groupBy('pointages.chantier_id')
          ->get();

积分表

chantiers 表

错误

【问题讨论】:

  • 如果你想在上面分组,你还需要选择 pointages.chantier_id
  • @Mike'Pomax'Kamermans thx 回答我尝试但它甚至给了我错误
  • 请通过使用新查询和新错误更新您的帖子来证明该声明。另外,请对错误进行截图:复制粘贴文本并对其进行代码格式化,或将其设为引号。

标签: mysql laravel group-by


【解决方案1】:

你的 mysql 版本是 5.7+,所以检查一下reference

MySQL 5.7.5 及更高版本实现了功能依赖检测。如果启用了 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 拒绝选择列表的查询

解决方案 1:

检查config/database.php,如果你的mysql配置strict => true,需要禁用ONLY_FULL_GROUP_BY,像这样添加modes

        'mysql' => [
            'driver' => 'mysql',
            ...
            'strict' => true,
            'engine' => null,
            'modes' => [
                //'ONLY_FULL_GROUP_BY',
                'STRICT_TRANS_TABLES',
                'NO_ZERO_IN_DATE',
                'NO_ZERO_DATE',
                'ERROR_FOR_DIVISION_BY_ZERO',
                'NO_AUTO_CREATE_USER',
                'NO_ENGINE_SUBSTITUTION'
           ],
        ],

PS:set strict => false 也可以,但禁用它会使您的应用不安全。

解决方案 2:

使用ANY_VALUE:

当启用 ONLY_FULL_GROUP_BY SQL 模式时,此函数对 GROUP BY 查询很有用,当 MySQL 拒绝一个您知道是有效的查询时,因为 MySQL 无法确定的原因。函数返回值和类型与其参数的返回值和类型相同,但是对于ONLY_FULL_GROUP_BY SQL模式不检查函数结果。

$dataP = DB::table('chantiers')
         ->leftJoin('pointages','pointages.chantier_id','chantiers.id')
          ->selectRaw('COALESCE(SUM(pointages.sold),0) AS sold, ANY_VALUE(chantiers.chantier) AS chantier, pointages.chantier_id')
          ->groupBy('pointages.chantier_id')
          ->get();

PS:ANY_VALUEMariaDB 上不存在。

【讨论】:

    【解决方案2】:

    只能在选择字段上进行分组

    根据您的上述查询,您没有在选择字段中添加分组字段,这就是 Laravel 给您错误的原因。

    那么请您尝试以下对您有用的方法

    $dataP = DB::table('chantiers')
             ->leftJoin('pointages','pointages.chantier_id','chantiers.id')
              ->selectRaw('COALESCE(SUM(pointages.sold),0) as sold,chantiers.chantier,pointages.chantier_id')
              ->groupBy('pointages.chantier_id')
              ->get();
    

    希望你得到你需要的答案

    【讨论】:

      【解决方案3】:

      在数据库 sql 中运行此命令

      SET GLOBAL sql_mode='';
      

      【讨论】:

      • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。
      猜你喜欢
      • 2017-12-13
      • 2016-12-06
      • 2022-10-24
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      相关资源
      最近更新 更多