教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)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 配置文件,在[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. 相关链接

Mysql无法选取非聚合列的更多相关文章

  1. MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题

    排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 By:授客 QQ:1033553122   测试环境 win10 MySQL 5.7 问题描述: 执行类似以下mysql查询, SEL ...

  2. mysql group by 查询非聚集列

    本文为博主原创,转载请注明出处: mysql使用group by可以使用一些聚合函数,可以计算最大值(max(column)),最小值(min(column)),总和(sum(column)),平均数 ...

  3. MYSQL中GROUP BY不包含所有的非聚合字段时的注意事项

    本文导读:在MYSQL中使用GROUP BY分组时,我们可以select 多个非聚合字段,但是这些字段不在GROUP BY中,这样的SQL查询在SQL SERVER.ORACLE中是不合理的,且会报错 ...

  4. 聚合索引(clustered index) / 非聚合索引(nonclustered index)

    以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL SERVER 标为Expert,看看是否 ...

  5. 从MySQL随机选取数据

    --从MySQL随机选取数据 -------------------------2014/06/23 从MySQL随机选取数据最简单的办法就是使用”ORDER BY RAND()”; 方案一: SEL ...

  6. sqlserver聚合索引(clustered index) / 非聚合索引(nonclustered index)的理解

    1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索 ...

  7. mysql数据库查询和聚合函数

    1.模糊查询 like % 表示多个任意字符 _ 表示任意一个字符 例如:查询黄姓同学 select * from student where name '黄%' select * from stud ...

  8. mysql索引总结(2)-MySQL聚簇索引和非聚簇索引

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  9. 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)

    [优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...

随机推荐

  1. 如何将已有的本地Git 库推送到远端仓库?

    以Github 为例 step 1. 在Github建立一个空的仓库 Step 2. 建立远端仓库的别名 >$ git remote add origin https://github.com/ ...

  2. 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

    [源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互 作者: ...

  3. 详解Android中的四大组件之一:Activity详解

    activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...

  4. Android开发工程师文集-提示框,菜单,数据存储,组件篇

    提示框,菜单,数据存储,组件篇 Toast Toast.makeText(context, text, 时间).show(); setDuration();//设置时间 setGravity();// ...

  5. EXCEL在改动某几个单元格时隐藏空列

    概述 今天我哥来找我帮他搞下excel表格,本着程序猿对程序无所不能的精神,我爽快的答应了.结果查了半天才搞定.现在记录在此,供自己以后参考,相信对其他人也有用. PS:这几天正在弄博客,马上就要弄完 ...

  6. Shell-8--数值运算及处理

    RANDOM 默认范围是 0~32767

  7. 使用Masonry对UIScrollView自动布局

    之前使用Masonry对UIScrollView进行过约束,当时是遇到了问题的,怎么约束都不对,因为赶进度直接改用frame了也没有对问题深究.就这样过了很久.........,直到前一段换工作的时候 ...

  8. centos6.6 安装adb环境

    a.安装JDK环境 centos linux JAVA(openjdk)软件包名 1.java-1.7.0-openjdk (OpenJDK Runtime Environment) 2.java-1 ...

  9. Android 引用文件(.db)的三种方式

    1.assets —— 资产目录(该目录中的文件会被直接打包到 apk 文件中).获取该目录下的文件的方式是: InputStream is = getContext().getAssets().op ...

  10. postgres 更新数据表

    新增非空列: alter table t_test add column user_id integer; update t_test set user_id=0; alter table t_tes ...