web-dev-qa-db-ja.com

SELECTリストはGROUP BY句に含まれておらず、非集約列が含まれています.... sql_mode = only_full_group_byと互換性がありません

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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
26
Dhanu K

この

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に変更するだけです。

ありがとうございました... :-)

83
Dhanu K

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は知りません)。

25
Tim Biegeleisen

無効にすることができます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';
13
Anil Gupta

クエリをSQL92で有効にするには、名前列を選択リストから省略するか、GROUP BY句で名前を付ける必要があります。

SQL99以降では、GROUP BY列に機能的に依存している場合、オプション機能T301ごとにこのような非集計が許可されます。名前とカストイドの間にそのような関係が存在する場合、クエリは有効です。これは、たとえば、顧客の主キーを管理する場合に当てはまります。

MySQL 5.7.5以降では、機能依存の検出が実装されています。 ONLY_FULL_GROUP_BY SQLモードが有効になっている場合(デフォルト)、MySQLは、選択リスト、HAVING条件、またはORDER BYリストが、GROUP BY句で名前が指定されておらず、機能的に依存していない非集計列を参照するクエリを拒否します。

MySQL :: MySQL 5.7リファレンスマニュアル:: 12.19.3 GROUP BYのMySQL処理

次のコマンドでSQLモードを変更することで解決できます。

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

そして...データベースを再接続することを忘れないでください!!!

7
ElliotMok

いずれかのソリューションを使用する

(1)PHPMyAdmin

phpMyAdminを使用している場合は、以下のスクリーンショットに記載されているように、「sql_mode」設定を変更します。 enter image description here

「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

7
Rakesh Soni

見た目から、複数のcolumns/fieldsでグループ化することで結果が損なわれることはないと思います。次のようにしてグループに追加してみませんか?

GROUP BY `proof_type`, `id`

これは、最初にproof_type、次にidでグループ化します。これにより結果が変わらないことを願っています。場合によっては、複数の列でグループ化すると、間違った結果が得られます。

0
jkkenzie
  1. PhpMyAdminへのログイン
  2. サーバー:localhost:3306に移動し、データベースを選択しないでください
  3. トップメニューから変数をクリックします
  4. 「SQLモード」を検索し、対応する値を次のように編集します:NO_ENGINE_SUBSTITUTION

それで全部です。

私はこれをEc2で行いましたが、それは魅力のように機能しました。

0
PrafulPravin

Dhanu KとAnil Guptaによる答えは私にとってはうまくいきましたが、結果を確認するにはターミナルでmysqlを再起動する必要があります。

0
Meder Mamutov