重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要为大家展示了“MySQL无法选取非聚合列怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mysql无法选取非聚合列怎么办”这篇文章吧。
专注于为中小企业提供做网站、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业济宁免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
1. 前言
给文章页面底部增加了两个按钮,可以直接跳转到上一篇和下一篇。
如下图所示:
实现这个功能的难点在于:数据库怎么选取出一条记录的前后两条相邻的记录?
2. 数据库设计
关于我文章数据库的设计如下图所示:
可以看到,每条记录的身份是索引Id。因为之前有很多文章记录被删除了,所以,Id并不是连续的。
如果当前文章的索引值是33,那么可以通过以下命令来得到前后相邻的 2 篇文章:
select * from passage where id in (select case when SIGN(id - 32 )>0 THEN MIN(id) when SIGN(id - 32 )<0 THEN MAX(id) end from passage where id != 34 GROUP BY SIGN(id- 32 ) ORDER BY SIGN(id- 32 ) ) ORDER BY id;
3. 无法选取聚合列
在执行上面命令时,Mysql给了我个: SELECT list is not in GROUP BY clause ...
的报错。经过 Google 得知,mysql 5.7以上,默认启动了only_full_group_by
,MySQL 就会拒绝选择列表、条件或顺序列表引用的查询。
以下是原文:
Reject queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on (uniquely determined by) GROUP BY columns. As of MySQL 5.7.5, the default SQL mode includes ONLY_FULL_GROUP_BY. (Before 5.7.5, MySQL does not detect functional dependency and ONLY_FULL_GROUP_BY is not enabled by default. For a description of pre-5.7.5 behavior, see the MySQL 5.6 Reference Manual.)
所以,我们应该设置sql_mode中不包含only_full_group_by
选项。MySQL 5.7.5后only_full_group_by成为sql_mode的默认选项之一,这可能导致一些sql语句失效。
进入 mysql 配置文件,在[mysqld]部分中添加以下配置,并且重启 mysql 即可。
[mysqld] # ... other config sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # delete 'only_full_group_by' # ... other config
运行本文第二部分的 mysql 的命令,结果如下图所示:
以上是“Mysql无法选取非聚合列怎么办”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!