WAMPサーバーを搭載したWindows PCでMySQL 5.7.13を使用しているAM
ここで私の問題はこのクエリの実行中です
SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
`status` = 'Active'
GROUP BY `proof_type`
このようなエラーが常に発生しています
SELECTリストの式#1はGROUP BY句に含まれておらず、GROUP BY句の列に機能的に依存していない非集計列「returntr_prod.tbl_customer_pod_uploads.id」が含まれています。これはsql_mode = only_full_group_byと互換性がありません
最適なソリューションを教えてください...
次のような結果が必要です
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 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 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
この
SELECTリストの式#1はGROUP BY句に含まれておらず、GROUP BY句の列に機能的に依存していない非集計列「returntr_prod.tbl_customer_pod_uploads.id」が含まれています。これはsql_mode = only_full_group_byと互換性がありません
このコマンドでMySQLのsqlモードを変更するだけで解決されます。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
これは私にも役立ちます。このプロジェクトでこのbeczを使用しました。このようなクエリが多数あるため、このSQLモードをonli_full_group_byに変更するだけです。
ありがとうございました... :-)
MySQLのonly_full_group_by
モードがオンになっている場合、それはGROUP BY
を使用するときに厳密なANSI SQLルールが適用されることを意味します。クエリに関して、これは、GROUP BY
列のproof_type
を選択した場合、選択できるものは2つだけであることを意味します。
proof_type
列、または
他の列の「集計」とは、別の列でMIN()
、MAX()
、AVG()
などの集計関数を使用することを意味します。したがって、あなたの場合、次のクエリは有効です。
SELECT proof_type,
MAX(id) AS max_id,
MAX(some_col),
MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
status = 'Active'
GROUP BY proof_type
SOに表示されるMySQL GROUP BY
質問の大部分では、厳格モードがオフになっているため、クエリは実行されていますが、結果は正しくありません。あなたの場合、クエリはまったく実行されず、本当に何をしたいのかを考える必要があります。
注:ANSI SQLは、選択されている列に機能的に依存の列も含めることにより、GROUP BY
で選択できるものを拡張します。機能的な依存関係の例は、テーブルの主キー列によるグループ化です。主キーはすべてのレコードで一意であることが保証されているため、他の列の値も決定されます。 MySQLはこれを可能にするデータベースの1つです(SQL ServerとOracleは知りません)。
無効にすることができますsql_mode = only_full_group_byターミナルまたはMySql IDEでこれを試すことができるコマンドによって
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
クエリをSQL92で有効にするには、名前列を選択リストから省略するか、GROUP BY句で名前を付ける必要があります。
SQL99以降では、GROUP BY列に機能的に依存している場合、オプション機能T301ごとにこのような非集計が許可されます。名前とカストイドの間にそのような関係が存在する場合、クエリは有効です。これは、たとえば、顧客の主キーを管理する場合に当てはまります。
MySQL 5.7.5以降では、機能依存の検出が実装されています。 ONLY_FULL_GROUP_BY SQLモードが有効になっている場合(デフォルト)、MySQLは、選択リスト、HAVING条件、またはORDER BYリストが、GROUP BY句で名前が指定されておらず、機能的に依存していない非集計列を参照するクエリを拒否します。
次のコマンドでSQLモードを変更することで解決できます。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
そして...データベースを再接続することを忘れないでください!!!
いずれかのソリューションを使用する
(1)PHPMyAdmin
phpMyAdminを使用している場合は、以下のスクリーンショットに記載されているように、「sql_mode」設定を変更します。
「SQLモード」変数を編集し、値から「ONLY_FULL_GROUP_BY」テキストを削除します
(2)コマンドプロンプト以下のコマンドを実行します。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
(3)SELECT *を使用しない
SELECTクエリで関連する列を使用します。 「関連」とは、「group by」句に含まれる列、または集計関数(MAX、MIN、SUM、COUNTなど)を持つ列のことです。
Point(1)OR point(2)を使用して行った変更は永続的に設定されず、再起動するたびに元に戻ります。
したがって、設定ファイル([mysqld]セクションの/etc/mysql/my.cnfなど)でこれを設定して、MySQLの再起動後も変更が有効になるようにする必要があります。
構成ファイル:/etc/mysql/my.cnf
変数名:sql_modeまたはsql-mode
見た目から、複数のcolumns/fieldsでグループ化することで結果が損なわれることはないと思います。次のようにしてグループに追加してみませんか?
GROUP BY `proof_type`, `id`
これは、最初にproof_type
、次にid
でグループ化します。これにより結果が変わらないことを願っています。場合によっては、複数の列でグループ化すると、間違った結果が得られます。
それで全部です。
私はこれをEc2で行いましたが、それは魅力のように機能しました。
Dhanu KとAnil Guptaによる答えは私にとってはうまくいきましたが、結果を確認するにはターミナルでmysqlを再起動する必要があります。