Mysqlは非集約列を選択できません

1962 ワード

チュートリアルに示す画像はgithub倉庫画像を使用しています.ネットの速度が遅すぎる方は>>>>(原文)Mysqlでは非集約列を選択できません.
詳細なディスカッションまたはエラーの送信も、ステップを移動してください.
1.はじめに
最近ブログをアップグレードして、文章のページの下部に2つのボタンを追加して、直接前編と次編にジャンプすることができます.次の図に示します.
この機能を実現する難点は、データベースが1つのレコードの前後の2つの隣接するレコードをどのように選択するかということです.
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リスト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

本明細書の第2部のmysqlのコマンドを実行します.結果は次の図に示します.
4.関連リンク
  • only_full_group_by