【问题标题】:SQL error: 'database.table.field isn't in GROUP BYSQL 错误:'database.table.field 不在 GROUP BY 中
【发布时间】:2015-01-16 18:52:11
【问题描述】:

我在安装第 3 方软件时遇到此问题。我已阅读相关主题,所有主题都建议将sql_mode 设置为空字符串(SET sql_mode = ''),但该解决方案对我不起作用。仍然得到同样的错误。我需要在我的配置文件中设置它吗?

这里有一些有用的信息;

Server version: 5.6.15-56-log Percona Server (GPL), Release rel63.0, Revision 519

mysql> SHOW VARIABLES LIKE 'sql_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+
1 row in set (0.00 sec)

带有错误消息的失败查询是;

mySQL query error: SELECT MAX(e.entry_id) as max, MAX(e.entry_date) as maxdate,b.blog_id, b.blog_name, b.blog_seo_name FROM blog_entries e  LEFT JOIN blog_blogs b ON ( b.blog_id=e.blog_id )   WHERE e.entry_status='published' AND e.entry_banish=0 AND e.entry_featured=0 AND b.blog_view_level='public' AND b.blog_disabled=0 GROUP BY e.blog_id, b.blog_name, b.blog_seo_name ORDER BY maxdate DESC LIMIT 0,50

SQL error: 'db_name_ipb.b.blog_id' isn't in GROUP BY
SQL error code: 1055

有什么想法吗?

更新

很遗憾,代码已加密,因此无法尝试您的建议。此外 - 如上所述 - 更改 SQL 模式并没有解决我的问题。我会继续调查和更新问题,以防万一。

【问题讨论】:

  • 这很令人困惑,因为这不是 MySQL 的默认行为。也许您应该尝试:SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode; 看看是否设置了其中之一。
  • 是第三方软件发出这个查询吗?正如一些答案所指出的,查询中存在缺陷。看起来您已在服务器中成功禁用 ONLY_FULL_GROUP_BY 模式。但它几乎不可能在您的第三方应用程序的会话中仍然启用。您可以尝试使用SET GLOBAL sql_mode = ''; 全局禁用它,看看您的查询是否开始工作。
  • 伙计们,感谢 cmets,但我已经尝试过了。请查看更新。

标签: mysql group-by


【解决方案1】:

您正在选择b.blog_id 并按e.blog_id 分组。这就是问题所在。

SELECT MAX(e.entry_id) as max, MAX(e.entry_date) as maxdate,b.blog_id, b.blog_name, b.blog_seo_name 
FROM blog_entries e  LEFT JOIN 
     blog_blogs b ON ( b.blog_id=e.blog_id )   
WHERE e.entry_status='published' AND e.entry_banish=0 AND e.entry_featured=0 
     AND b.blog_view_level='public' AND b.blog_disabled=0 
GROUP BY b.blog_id, b.blog_name, b.blog_seo_name 
ORDER BY maxdate DESC LIMIT 0,50

【讨论】:

    【解决方案2】:

    这是您的查询:

    SELECT MAX(e.entry_id) as max, MAX(e.entry_date) as maxdate, b.blog_id, b.blog_name, b.blog_seo_name
    FROM blog_entries e LEFT JOIN
         blog_blogs b
         ON b.blog_id = e.blog_id
    WHERE e.entry_status = 'published' AND e.entry_banish = 0 AND
          e.entry_featured = 0 AND b.blog_view_level='public' AND
          b.blog_disabled=0
    GROUP BY e.blog_id, b.blog_name, b.blog_seo_name
    ORDER BY maxdate DESC
    LIMIT 0,50;
    

    您在group by 中有e.blog_id,但在select 中有b.blog_id。您应该选择其中一个。

    请注意:left join 可以只是 inner join。无论如何,b 表上的where 中的条件正在将其变成inner join

    注意:MySQL 通常不强制执行此操作。您的环境必须设置ONLY_FULL_GROUP_BY 模式,因此您的SQL 模式不包含任何内容是非常可疑的。更多关于设置 SQL 模式的信息是here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多