SELECT列表不在GROUP BY子句中,并且包含未聚合的列;这与sql_mode = only_full_group_by不兼容

时间:2018-06-20 11:55:34

标签: mysql hibernate group-by mysql-error-1064

这是我使用Hibernate的查询:

Query query = session.createQuery("
              From Invite 
             where (mobileNo= :email OR mobileNo= :phone) AND status= :status GROUP BY job");

我收到错误消息:

        SELECT list is not in 
      GROUP BY clause and contains nonaggregated column 'irecruter.invitecand0_.invite_id' which is not functionally dependent on columns in GROUP BY clause; this is  incompatible with sql_mode=only_full_group_by

我从StackOverflow得到了解决方案:SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

但是错误又回来了。我要永久解决。有人可以对此提出建议吗?

2 个答案:

答案 0 :(得分:1)

想象一下一个存储论坛帖子的表格。您可以存储帖子本身,帖子的日期以及发布该帖子的用户。

当您执行以下操作时:

SELECT
    User_ID,
    PostedDate,
    COUNT(*) AS Posts
FROM myForum
WHERE PostedDate = CURDATE()
GROUP BY User_ID;

我们都知道您想要什么。数据库会说“ User_ID?是的。分组依据之后必须是唯一的。帖子由分组依据聚合,但是我应该对PostDate做些什么?我应该返回哪个?”。在这种情况下,它将是唯一的,但是如果where子句不检查确切的“ PostedDate”而是一个范围,则该语句未定义应返回哪个值。

安全模式下的此设置可防止某人犯此类逻辑错误。如果您知道自己在做什么,则可以禁用该检查或执行诸如“ MIN”,“ GROUP_CONCAT(DISTINCT PostedDate)AS PostedDate”,...

在这种情况下,您也可以使用ANY_VALUE(),它在该组中选择一个值。像这样使用它:

SELECT
    ANY_VALUE(myUsers.UserName) AS UserName,
    User_ID,
    COUNT(ForumPosts.Post) AS Posts
FROM myUsers
NATURAL JOIN ForumPosts
WHERE ForumPosts.PostDate = CURDATE()
GROUP BY User_ID;

答案 1 :(得分:0)

尝试在查询的末尾添加invite_id,使之显示为GROUP BY job,invite_id");,您需要在group by中选择所有内容,因此我的假设是这样

完整行:

Query query = session.createQuery("from Invite where (mobileNo= :email OR mobileNo= :phone) AND status= :status GROUP BY job,invite_id");