mysql - 发生数据库错误错误号: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 的解决方法,但是如何解决查询错误?
解决方案
问:为什么会报错?
考虑两行 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
推荐阅读
- javascript - 鼠标悬停在 React
- php - “stream_socket_enable_crypto():对等证书 CN=`gains.nanosupercloud.com' 与共享主机中的预期 CN=`smtp.sendgrid.net' 不匹配”
- android - 如何将 RecyclerView 与 CollapsingToolbarLayout 一起使用。RecyclerView 到达底部时需要加载更多数据
- python - 检查 Python 包是否需要 Visual Studio 构建工具
- python - 如何构建在线点对点视频聊天 Web 应用程序,什么技术堆栈任何库?特别是在python中
- javascript - 如何停止 Angular 中的重复 api 调用
- docker - 从一个容器 SSH 到另一个容器
- c# - 将字符串转换为日期格式为 'dd.MM.yyyy HH:mm:ss.fff z'
- c# - 为什么我的动画在 Unity 中是倒退的?
- nginx - NGiNX RTMP DASH 指令:dash_playlist_length 有什么作用?