Mysql無法選取非聚合列的解決方法
1. 前言
最近升級博客,給文章頁面底部增加了兩個按鈕,可以直接跳轉到上一篇和下一篇。
如下圖所示:

實現(xiàn)這個功能的難點在于:數(shù)據(jù)庫怎么選取出一條記錄的前后兩條相鄰的記錄?
2. 數(shù)據(jù)庫設計
關于我文章數(shù)據(jù)庫的設計如下圖所示:

可以看到,每條記錄的身份是索引Id。因為之前有很多文章記錄被刪除了,所以,Id并不是連續(xù)的。
如果當前文章的索引值是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. 無法選取聚合列
在執(zhí)行上面命令時,Mysql給了我個: SELECT list is not in GROUP BY clause ... 的報錯。經(jīng)過 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. 相關鏈接
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
MySQL優(yōu)化之如何寫出高質(zhì)量sql語句
在數(shù)據(jù)庫日常維護中,最常做的事情就是SQL語句優(yōu)化,因為這個才是影響性能的最主要因素。這篇文章主要給大家介紹了關于MySQL優(yōu)化之如何寫出高質(zhì)量sql語句的相關資料,需要的朋友可以參考下2021-05-05
MySQL數(shù)據(jù)庫主機127.0.0.1與localhost區(qū)別
這篇文章主要介紹了MySQL主機127.0.0.1與localhost區(qū)別總結,需要的朋友可以參考下2018-06-06
MySQL遷移到Oracle數(shù)據(jù)庫的超詳細步驟和方法總結
今天接到一個任務,讓我把MySQL中的表與數(shù)據(jù)移植到Oracle中,所以這里總結下,這篇文章主要給大家介紹了關于MySQL遷移到Oracle數(shù)據(jù)庫的超詳細步驟和方法,需要的朋友可以參考下2023-11-11
DataGrip的MySQL數(shù)據(jù)導出和導入操作超詳細指南
很多時候我們會遇到需要將本機數(shù)據(jù)庫數(shù)據(jù)導出或者其他數(shù)據(jù)庫數(shù)據(jù)的導入操作,這篇文章主要給大家介紹了關于DataGrip的MySQL數(shù)據(jù)導出和導入操作超詳細指南,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-04-04
Mysql行與列的多種轉換(行轉列,列轉行,多列轉一行,一行轉多列)
在MySQL中,行轉列和列轉行都是非常有用的操作,本文就來介紹一下Mysql行與列的多種轉換,主要包括行轉列,列轉行,多列轉一行,一行轉多列,具有一定的參考價值,感興趣的可以了解一下2023-08-08

