MySQL 5.7 上就报什么 ORDER BY 的字段不在 SELECT 的列表中的 SQL 异常

本文介绍了一个关于MySQL5.7版本中使用ORDER BY字段不在SELECT列表中导致的问题及解决方案。通常可以通过修改sql_mode配置来解决此问题,但更推荐的做法是在SELECT列表中包含ORDER BY涉及的字段。

 

看看下面这个 SQL 语句:

SELECT DISTINCT guid FROM table1 WHERE user=? ORDER BY id DESC

这个 SQL 语句在 MySQL 5.6 以及之前的版本都可以正确执行。但是跑到 MySQL 5.7 上就报什么 ORDER BY 的字段不在 SELECT 的列表中的 SQL 异常。

解决的办法是修改 MySQL 5.7 的 sql_mode 值,去掉 ONLY_FULL_GROUP_BY 这玩意。

可以直接在 my.cnf 配置的 [mysqld] 段增加如下配置并重启 MySQL 即可:

 

sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE

 

转载为:https://www.oschina.net/question/12_2183893

 

总结:针对此问题,不建议修改,这个涉及到很多其他的库,order by 的字段放到 select 列表中,是很正常的要求。根据业务需要可以在查询的的字段后面补充order by字段。

### MySQLOrder By字段不在Select列表中的解决方案 在MySQL中,`ORDER BY` 排序的字段不一定非要出现在 `SELECT` 语句的结果集中。然而,在某些情况下,特别是当使用 `DISTINCT` 或者特定版本下可能会遇到异常情况。 对于5.7.22版本的MySQL而言,即使是在 `SELECT DISTINCT` 和 `ORDER BY` 同时使用的场景下,也允许 `ORDER BY` 的字段不出现在 `SELECT` 列表里[^1]。但是也有道指出,在MySQL 5.7 版本上存在因 `ORDER BY` 字段于 `SELECT` 列表而引发SQL异常的情况[^2]。 #### 处理方法一:调整查询逻辑 一种常见的做法是基于业务需求来决定是否应该把用于排序的字段加入到 `SELECT` 子句之中。如果确实有必要保留当前结构,则可以考虑通过子查询的方式先获取所需数据再做进一步的操作: ```sql SELECT * FROM ( SELECT DISTINCT column1, column2 FROM table_name ) AS subquery ORDER BY some_column_not_in_select; ``` 这种方法能够绕过直接在同一层 `SELECT` 中同时应用 `DISTINCT` 及 `ORDER BY` 所带来的限制。 #### 处理方法二:遵循标准语法要求 另一种更为推荐的方法是从根本上解决问题——即按照SQL的标准实践方式行事,将所有参与排序操作的字段都显式地包含进 `SELECT` 语句之内。这不仅有助于提高代码可读性和维护性,而且能有效规避不同数据库引擎间可能存在的兼容性差异。 需要注意的是,尽管有观点认为不应对此类行为做出更改以免影响其他依赖组件的工作,但从长远来看,保持良好的编程习惯总是利大于弊。 #### 示例代码展示 下面给出一段Python脚本作为示范,它展示了如何构建一个符合上述原则的SQL查询字符串: ```python def build_query(columns_to_select, columns_for_ordering): base_columns = ", ".join([f"`{col}`" for col in set(columns_to_select + columns_for_ordering)]) query = f""" SELECT {base_columns} FROM your_table WHERE conditions_here ORDER BY {" ,".join(f'`{c}`' for c in columns_for_ordering)} """ return query.strip() # 使用示例 columns_selected = ["id", "name"] ordering_fields = ["age"] print(build_query(columns_selected, ordering_fields)) ``` 这段程序接受两个参数:一个是待选取的数据项名称组成的列表;另一个是用来指定排序依据的一组属性名。最终返回一条完整的SQL命令文本,其中包含了所有的必要组成部分。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值