插件窝 干货文章 SQL中groupBy和eq的同时使用问题

SQL中groupBy和eq的同时使用问题

code 子句 使用 聚合 439    来源:    2024-10-28

groupByeq同时使用可能会导致错误。这是因为在大多数关系型数据库中,当使用groupBy对结果进行分组聚合时,只能选择groupBy的字段和聚合函数的结果作为返回结果,不能使用其他的非聚合查询条件。

在 SQL 语句中,GROUP BY 用于对查询结果进行分组,而 WHERE 子句用于筛选符合条件的行。当我们使用GROUP BY子句时,我们只能查询被分组的列和聚合函数的计算结果,并且不能再在SELECT之后使用WHERE子句,否则就会出现错误。

如果您需要同时使用GROUP BYWHERE,可以使用另一个子句:HAVINGHAVING为分组后的结果集设置条件。

如果您需要根据条件进行过滤,并且同时使用groupBy进行分组聚合,可以考虑使用having语句来替代eq条件。

Wrappers.<ZxxxPlaybackRecord>query()
    .select("chapter_id")
    .groupBy("chapter_id")
    .having("chapter_id = {0}", courseStatistics.getChapterId())

在此示例中,我们使用having方法来设置过滤条件,其中{0}是占位符,表示传入courseStatistics.getChapterId()的值。

在 MySQL 5.7 版本中,默认的 sql_mode 不包含 ONLY_FULL_GROUP_BY,因此即使在 GROUP BY 子句中未包含所有非聚合列,也不会触发错误。

而在 MySQL 8.0 版本中,默认的 sql_mode 包含了 ONLY_FULL_GROUP_BY,这意味着在 GROUP BY 语句中必须包含查询结果中的所有非聚合列,否则就会报错。

为了解决这个问题,您可以采取以下两种方法之一:

调整 SQL 查询语句:

您需要确保在 GROUP BY 语句中包含所有非聚合的列,并且这些列的值可以唯一确定。如果有任何一个非聚合的列不能唯一确定,则需要将其从 SELECT 子句中删除或添加到 GROUP BY 子句中。

更新 MySQL 的配置:

如果您希望禁用 ONLY_FULL_GROUP_BY 模式,可以修改 MySQL 的配置文件,将 sql_mode 的值更改为适当的设置。例如,您可以将其设置为:

sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

保存并重启 MySQL 服务以使更改生效。

请注意,对于涉及聚合操作和 GROUP BY 的查询,建议始终遵循 SQL 标准,并包含查询结果中所有非聚合的列到 GROUP BY 子句中。这样可以确保查询的结果是一致的,并且在不同版本的 MySQL 中都能正常工作。

到此这篇关于SQL中groupBy和eq的同时使用问题的文章就介绍到这了,更多相关groupBy和eq同时使用内容请搜索插件窝以前的文章或继续浏览下面的相关文章希望大家以后多多支持插件窝!