发生数据库错误,错误号:1055,按子字符串分组

时间:2019-01-17 22:57:39

标签: mysql codeigniter

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

1 个答案:

答案 0 :(得分:2)

问:为什么会出错?

考虑具有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