Mysql无法选取非聚合列的解决方法

 更新时间:2018年09月05日 16:50:27   作者:GodBMW  
这篇文章主要给大家介绍了关于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 的命令,结果如下图所示:

4. 相关链接

only_full_group_by

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • MySQL优化之如何写出高质量sql语句

    MySQL优化之如何写出高质量sql语句

    在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要因素。这篇文章主要给大家介绍了关于MySQL优化之如何写出高质量sql语句的相关资料,需要的朋友可以参考下
    2021-05-05
  • MySQL数据库主机127.0.0.1与localhost区别

    MySQL数据库主机127.0.0.1与localhost区别

    这篇文章主要介绍了MySQL主机127.0.0.1与localhost区别总结,需要的朋友可以参考下
    2018-06-06
  • MySQL迁移到Oracle数据库的超详细步骤和方法总结

    MySQL迁移到Oracle数据库的超详细步骤和方法总结

    今天接到一个任务,让我把MySQL中的表与数据移植到Oracle中,所以这里总结下,这篇文章主要给大家介绍了关于MySQL迁移到Oracle数据库的超详细步骤和方法,需要的朋友可以参考下
    2023-11-11
  • 浅析Mysql和Oracle分页的区别

    浅析Mysql和Oracle分页的区别

    Mysql使用limit分页而Oracle使用rownum分页,下面通过本文给大家介绍Oracle和Mysql分页的区别,需要的的朋友参考下吧
    2022-12-12
  • DataGrip的MySQL数据导出和导入操作超详细指南

    DataGrip的MySQL数据导出和导入操作超详细指南

    很多时候我们会遇到需要将本机数据库数据导出或者其他数据库数据的导入操作,这篇文章主要给大家介绍了关于DataGrip的MySQL数据导出和导入操作超详细指南,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • mysql时间是varchar类型进行比较

    mysql时间是varchar类型进行比较

    本文主要介绍了mysql时间是varchar类型进行比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Mysql一主多从部署的实现步骤

    Mysql一主多从部署的实现步骤

    本文主要介绍了Mysql一主多从部署的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Mysql行与列的多种转换(行转列,列转行,多列转一行,一行转多列)

    Mysql行与列的多种转换(行转列,列转行,多列转一行,一行转多列)

    在MySQL中,行转列和列转行都是非常有用的操作,本文就来介绍一下Mysql行与列的多种转换,主要包括行转列,列转行,多列转一行,一行转多列,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • MySQL如何清空慢查询文件

    MySQL如何清空慢查询文件

    这篇文章主要介绍了MySQL如何清空慢查询文件,如何在线生成一个新的慢查询文件,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • MySQL DBA 常用手册小结

    MySQL DBA 常用手册小结

    MySQL DBA 常用手册小结,使用mysql的朋友可以参考下。
    2011-11-11

最新评论