SELECT ステートメントの列は GROUP BY 句に含まれておらず、非集計列が含まれています....sql_mode=only_full_group_by と互換性がありません
P粉521748211
2023-08-21 13:21:31
<p>Windows PC 上の WAMP サーバーで MySQL 5.7.13 を使用しています</p>
<p>私の問題は、このクエリを実行するときです</p>
<pre class="brush:php;toolbar:false;">SELECT *
`tbl_customer_pod_uploads` から
WHERE `load_id` = '78' AND
`ステータス` = 'アクティブ'
GROUP BY `proof_type`</pre>
<p>いつもこのエラーが発生します</p>
<ブロック引用>
<p>SELECT リストの式 #1 は GROUP BY 句になく、GROUP BY 句の列に機能的な依存関係がない非集計列 'returntr_prod.tbl_customer_pod_uploads.id' を含んでいます。これは次と一致しています。 sql_mode =only_full_group_by は互換性がありません</p>
</blockquote>
<p>最善の解決策を教えてください。 </p>
<p>必要な結果は次のとおりです</p>
<pre class="brush:php;toolbar:false;"> ---- --------- --------- --------- -- -------- ---------- ------------ --------------- ---- - --------- ------------ -------- -------------------- - ------------------------
| id | user_id |load_id | bill_id | latitude | langitude |proof_type | document_type | file_name | is_private | status | createdon | updatedon |
---- --------- --------- ------------- ---------- --------- ------------------------------------------------ ---- - -------- ------------------------ -------------- - ----
| 1 | 1 | 78 | 1 | 21.1212 | 21.5454 | 1 | 1 | id_Card.docx | 0 | アクティブ | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
---- --------- --------- ------------- ---------- --------- ------------------------------------------------ ---- - -------- ------------------------ -------------- - ---- </pre>
<p><br /></p>
MySql エンジンにはシステム変数
ONLY_FULL_GROUP_BY
があります。Mysql バージョン 5.7.5 以降 :
ONLY_FULL_GROUP_BY
SQL モードはデフォルトで有効になります。バージョン 5.7.5 より前:
ONLY_FULL_GROUP_BY
はデフォルトでは有効になっていません。ONLY_FULL_GROUP_BY
SQL モードが有効になっている場合 (バージョン 5.7.5 以降はデフォルトで有効になっています)、MySQL はクエリ選択リスト、HAVING
条件、またはORDER BY# を拒否します。 ## このリストは、
GROUP BY句で名前が指定されておらず、句に依存していない非集計列を参照しています。
(1) PHPMyAdmin
無効化: ONLY_FULL_GROUP_BY
phpMyAdmin を使用している場合は、以下のスクリーンショットに従ってモード
sql_mode
編集設定を変更してください。
SQLモード
変数を値から削除
ONLY_FULL_GROUP_BYText
######または######(2) SQL/コマンドプロンプト
コマンド ONLY_FULL_GROUP_BY モードを実行して、
を無効にします。リーリー ######または###### (3)
SELECT *
は使用しないでください。
ONLY_FULL_GROUP_BY モードを無効にせず、代わりに
SELECT
クエリで関連列を使用します。関連列は、group by 句に現れる列、または集計関数 (MAX
、、
MINSUM
) で設定して、MySQL が再起動しても変更が変わらないようにする必要があります。起動後に有効になります:、
) を持つ列を指します。 COUNTなど) 列
######重要######
point(1) または point(2)を使用して行われた変更は永続的に設定されず、再起動するたびに復元されます。
したがって、これを構成ファイル (たとえば、
[mysqld]セクション
/etc/mysql/my.cnf設定ファイル:
/etc/mysql/my.cnf
変数名:
sql-modesql_mode
or
値から
ONLY_FULL_GROUP_BY
という単語を削除し、ファイルを保存します。
注
: sql_mode変数が構成ファイル内に見つからない場合は、ファイルの最後に次の2行を挿入してください。 リーリー
###これ###
この問題は、次のコマンドを使用して MySQL の SQL モードを変更するだけで解決します。 リーリー
私にも効果があります... これを使用したのは、プロジェクトに同様のクエリが多数あったため、この SQL モードをonly_full_group_byに変更しただけです。
または、単純に SELECT ステートメントで指定されたすべての列を GROUP BY 句に含めます。 sql_mode は有効のままにすることができます。###ありがとう... :-)###
更新日: 2023年7月14日
SQL スキーマの変更は回避策ですが、構造化クエリ言語のベスト プラクティスは、すべての (SELECT *...) 列の選択を避け、代わりに @Tim Biegeeisen のようなグループ化された列に対して集計関数を使用することです。
https ://stackoverflow.com/a/41887524/3602846以下の回答で言及されています