【问题标题】:A Database Error Occurred Error Number: 1055 , group by substring发生数据库错误错误号:1055,按子字符串分组
【发布时间】:2019-01-17 22:57:39
【问题描述】:

SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列“shows.b.show_title”,它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容

SELECT b.show_title as show_title FROM `shows` `b` 
WHERE `b`.`active` = 1 
GROUP BY SUBSTRING(show_title, 1, 1)

我正在命名选择查询中的所有列,为什么会出现错误?

我知道从 sql_mode 禁用 ONLY_FULL_GROUP_BY 的解决方法,但是如何解决查询错误?

【问题讨论】:

  • 您的查询毫无意义。您想为字母表中的每个字母选择一个有效的随机标题,并且该字母具有以该字母开头的活动标题?

标签: mysql codeigniter


【解决方案1】:

问:为什么会出错?

考虑 show_title 值分别为“True Detective”和“True Lies”的两行

GROUP BY 中的表达式将为这两行返回 T,因此这些行将在结果集中折叠成一行。

查询只能为折叠行中的一列返回一个值,并且返回两个值中的哪一个是不确定/不明确的。使用 sql_mode 中的 ONLY_FULL_GROUP_BY,MySQL 更接近于 ANSI SQL 规范; 1055 错误的行为类似于我们在其他关系 DBMS 中观察到的行为,例如Oracle、Microsoft SQL Server、Teradata、DB2 等。


问:如何解决查询错误?

规范模式是使用聚合函数来指定要返回的值(从一组可能的值中)。

例如,MAX()MIN()。示范:

SELECT SUBSTR(b.show_title,1,1)    AS s1 
     , MAX(b.show_title)           AS max_show_title
     , MIN(b.show_title)           AS min_show_title
  FROM shows b
 WHERE b.active = 1
 GROUP BY SUBSTR(b.show_title,1,1)

将避免 1055 错误,并可以返回例如

s1  max_show_title   min_show_title
--  ---------------  ---------------
T   True Lies        True Detective

【讨论】:

    【解决方案2】:

    只需使用这两个查询并将它们作为查询运行。 您的问题将尽快得到解决。 无需重启mysql

    解决方案: 运行这个查询:

    1. SET sql_mode = '';
    2. SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 2011-10-26
      • 2012-10-31
      • 1970-01-01
      • 2022-11-22
      • 2017-01-10
      • 2018-09-18
      • 2017-06-06
      相关资源
      最近更新 更多