为了账号安全,请及时绑定邮箱和手机立即绑定

Mysql无法选取非聚合列

标签:
MySQL

更多讨论或者错误提交,也请移步。

1. 前言

最近升级博客,给文章页面底部增加了两个按钮,可以直接跳转到上一篇和下一篇。如下图所示:


webp

效果图

实现这个功能的难点在于:数据库怎么选取出一条记录的前后两条相邻的记录?

2. 数据库设计

关于我文章数据库的设计如下图所示:


webp

数据库设计

可以看到,每条记录的身份是索引Id。因为之前有很多文章记录被删除了,所以,Id并不是连续的。

如果当前文章的索引值是33,那么可以通过以下命令来得到前后相邻的 2 篇文章:

select * from passage where id in(selectcasewhen SIGN(id - 32 )>0 THEN MIN(id)when SIGN(id - 32 )<0 THEN MAX(id)endfrom passagewhere id != 34GROUP 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 配置文件,在[mysqld]部分中添加以下配置,并且重启 mysql 即可。

[mysqld]# ... other configsql_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 的命令,结果如下图所示:


webp

运行结果



作者:godbmw
链接:https://www.jianshu.com/p/26d4599f6289


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
205
获赞与收藏
1008

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消