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