开发者社区 问答 正文

[SQL Server]选择列表中的列“ retailers.id”无效,因为该列既不包含在聚合函

我将laravel与mssql结合使用,并通过简单的分组查询得到此错误。RetailersModel :: groupBy('state')-> get();

它返回我错误。我已将数据库服务器从mysql迁移到mssql。Mysql运行正常,但尝试从ms-sql数据库服务器获取记录时发生错误。

我还在数据库php中的mysql和mssql config中设置了strict false。

提前致谢。

![H9@CFMY`}1]GARLYVLME2SF.png](https://ucc.alicdn.com/pic/developer-ecology/71a0296a1c2541fd86b195625e229b06.png)

展开
收起
游客syccbxcrjoo2g 2019-12-08 11:57:13 787 分享 版权
阿里云 AI 助理回答

遇到您描述的问题,看起来是由于Laravel的查询构造器在与MSSQL数据库配合时,可能不完全兼容导致的。错误提示表明groupBy语句存在问题,这通常是因为MSSQL对GROUP BY的使用有更严格的限制,尤其是在选择列与分组列不完全一致时。

解决方案

  1. 确保选择的列包含在GROUP BY: 在Laravel中,当你使用groupBy时,需要确保查询中选择的所有列要么是聚合函数的结果(如COUNT, SUM, AVG等),要么包含在GROUP BY子句中。例如,如果你的查询类似于下面这样:

    $results = RetailersModel::select('state', DB::raw('COUNT(*) as total'))
                            ->groupBy('state')
                            ->get();
    

    这里,我们只选择了state列,并且用一个聚合函数计算了每个状态的总数。这样的查询应该能在MSSQL上正常运行。

  2. 修改SQL模式以适应非聚合列: 如果你确实需要选择非聚合列并且它们不在GROUP BY中,MSSQL允许通过设置会话级的兼容性级别来改变这种行为。但请注意,这种方法可能会引入其他问题,因为它改变了SQL的标准行为。这通常不是推荐的做法,但在某些特定场景下可能是必要的。不过,在Laravel中直接操作这个设置较为复杂,且不推荐。

  3. 检查数据库连接配置: 确保你的数据库连接配置正确无误,特别是字符集和编码设置,虽然这不一定直接解决GROUP BY问题,但正确的配置可以避免其他潜在问题。

  4. 使用原生SQL查询: 如果上述方法都无法满足需求,作为最后的手段,你可以考虑使用Laravel的DB::raw()来编写原生SQL查询,这样你有更大的灵活性来调整查询以适应MSSQL的语法要求。

    $results = DB::select(DB::raw("SELECT state, COUNT(*) as total FROM retailers GROUP BY state"));
    

请尝试上述建议并查看是否解决了您的问题。如果问题依旧,请提供更多的错误信息或查询详情,以便进行更深入的分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答