首页 > 解决方案 > 发生数据库错误错误号:1055,按子字符串分组

问题描述

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 的解决方法,但是如何解决查询错误?

标签: mysqlcodeigniter

解决方案


问:为什么会报错?

考虑两行 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

推荐阅读