SELECTリストはGROUP BY句になく、非集計列が含まれています…sql_mode = only_full_group_byと互換性がありません


115

AMとWAMPサーバーを搭載したWindows PCでMySQL 5.7.13を使用

ここで私の問題は、このクエリの実行中に

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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

12
使用しないでくださいSELECT *
shmosel 2017年


このように言っていますSELECT id FROM tbl_customer_pod_uploadsWHERE load_id= '78' AND status= 'Active' GROUP BYproof_type
Dhanu K

2
古いクエリとの互換性が必要な場合は、only_full_group_bySQLモードをオフにできます。
Barmar 2017年

4
ANY_VALUE(proof_type)を使用してみてください: dev.mysql.com/doc/refman/5.7/en/group-by-handling.html SELECT *、ANY_VALUE(proof_type)FROM tbl_customer_pod_uploadsWHERE load_id= '78' AND status= 'Active' GROUP BYproof_type
AlexGach

回答:


228

この

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',''));

これも私にとってはうまくいきます。私のプロジェクトにはこのような多くのクエリがあるので、これを使用しました。このSQLモードをonly_full_group_byに変更しただけです。

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


14
わたしにはできる!。あなたは私の日を救います。MYSQLサービスを
再起動

2
codeigniterを使用していて、モデルで実行したい場合、それをどのように使用しますか?私を助けることができますか?@marcode_ely
DhavalThakor

@DhavalThakor、サーバーでこのクエリを実行すると、何度も実行する必要はありません。したがって、モデルに
追加

2
MySQL 5.7.29、サービスを再起動する必要はありませんでした
Taavi

サーバーバージョン5.7.31-0ubuntu0.16.04.1-(Ubuntu)を使用しています。マシンを起動するたびに、毎回設定します。これに対する永続的な修正はありますか?
Arpita Hunka

71

MySQLのonly_full_group_byモードがオンになっている場合は、を使用するときに厳密なANSI SQLルールが適用されることを意味しますGROUP BY。クエリに関しては、これはGROUP BYproof_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

GROUP BY私がSOで見るMySQL 質問の大部分は、厳密モードがオフになっているため、クエリは実行されていますが、結果は正しくありません。あなたの場合、クエリはまったく実行されず、本当に何をしたいのかを考えるように強いられます。

注:ANSI SQLは、選択されGROUP BYている列に機能的に依存する列を含めることにより、選択できるものを拡張します。機能依存の例としては、テーブルの主キー列によるグループ化があります。主キーはすべてのレコードで一意であることが保証されているため、他の列の値も決定されます。MySQLはこれを可能にするデータベースの1つです(SQL ServerとOracleはAFAIKではありません)。


2
注:結果は正しくありませんが(MySQLルールに従います)、予測不可能です。つまり、グループ化の一部ではなく、集計もされていない(機能的に依存していない)列は、対応するグループから「ランダムな」値を返します。マニュアルに記載されているように、「サーバーは各グループから任意の値を自由に選択できます」
Pred

厳密なグループ化に違反しても、必ずしも正しくない結果が生じるわけではありません。通常は、フィールドが同一であることが保証されている場合に実行します(例:1対多の結合)。また、保証されていない場合でも、任意の行を選択することは、集計関数を使用したり、グループ化レベルを追加したりするよりも、多くの場合不正確ではありません。
shmosel 2017年

1
+1。上記の「受け入れられた」回答が受け入れられた理由はわかりません。あなたの方法は正しい方法であり、受け入れられた答えは、将来さらに問題が発生する通常のハック修正です。
Jcov

1
@Jcov ...そして私はあなたのコメントに+1以上同意することができませんでした。ANSI制限をオフにすることGROUP BYは、ほとんど常に悪い考えです。多くのユーザーが間違ったアドバイスを取り、それを使用しているのは恐ろしいことです。
Tim Biegeleisen

1
@TimBiegeleisenは、最新のコピーとペーストの開発へようこそ。「私は考える必要はありません。信頼できないソースからどこかでランダムなものを読んだ人は、すでに私のために考えています」。
Jcov

38

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

(1)PHPMyAdmin

phpMyAdminを使用している場合は、以下のスクリーンショットで説明されているように、「sql_mode」設定を変更します。 ここに画像の説明を入力してください

「sqlモード」変数を編集し、値から「ONLY_FULL_GROUP_BY」テキストを削除します

(2)SQL /コマンドプロンプト 以下のコマンドを実行します。

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

(3)** SELECTを使用しない***

SELECTクエリで関連する列を使用します。関連とは、「group by」節または集計関数(MAX、MIN、SUM、COUNTなど)を含む列のいずれかにある列を意味します。


重要な注意点

point(1)またはpoint(2)を使用して行った変更では、永続的に設定されず、再起動するたびに元に戻ります。

したがって、これを設定ファイル(たとえば、[mysqld]セクションの/etc/mysql/my.cnf)で設定して、MySQLの再起動後も変更が有効になるようにする必要があります。

設定ファイル:/etc/mysql/my.cnf

変数名:sql_mode OR sql-mode


19

以下の方法で問題が解決しました:

Ubuntuで

タイプ: sudo vi /etc/mysql/my.cnf

Aと入力して挿入モードに入ります

最後の行に、以下の2行のコードを貼り付けます。

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

escと入力して入力モードを終了します

Type :wq to save and close vim.

sudo service mysql restartMySQLを再起動するために入力します。


1
おかげで、うまくいきました!cent os、whm、my.cnfはsudo vi /etc/my.cnfにありました
Reejesh PK

17

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';

9

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

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

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

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

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

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

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


9

Ubuntuでは

ステップ1:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

ステップ2:最後の行に移動し、次を追加します

sql_mode = ""

ステップ3:保存

ステップ4:mysqlサーバーを再起動します。


5

phpmyadminに移動してコンソールを開き、このリクエストを実行します

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

3

PhpMyAdminを使用している場合に「SQLモード」を検索し、値を削除します:実行ONLY_FULL_GROUP_BYしただけで問題ありません。


2

見た目から、複数の列/フィールドでグループ化しても結果に影響はないと思います。次のようにしてグループに追加してみませんか。

GROUP BY `proof_type`, `id`

これはproof_type最初にグループ化されidます。これが結果を変えないことを願っています。一部またはほとんどの場合、複数の列でグループ化すると誤った結果が得られます。


2
> sudo nano /etc/mysql/my.cnf

以下に入力してください

[mysqld]
sql_mode = ""

Ctrl + O => Y = Ctrl + X

> sudo service mysql restart

2

こんにちは、すべての列をとるのではなく、を使用して必要なものだけを取ってくださいANY_VALUE(column_name)。それは完全に働いています。確認してください。

例えば:

SELECT proof_type,any_value("customer_name") as customer_name
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`

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

それで全部です。

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


1

これはそれを永久に設定する本当に速くて簡単な方法です

注意:実行SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); は一時的なものであり、サーバーの再起動時にもエラーが発生します。これを永久に修正するには、以下を実行してください

  1. rootとしてサーバーにログインします
  2. あなたのターミナルで wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
  3. 実行してスクリプトを実行可能にします chmod +x disable-strict-mode.sh
  4. 実行してスクリプトを実行します ./disable-strict-mode.sh

そして、あなたの完了、変更はmysqlに行われ、再起動されます


0

MySQL 8.0の更新

ここに記載されているように削除されているため、あなたにsql-modeはないでしょう-how-to-set-sql-mode-in-my-cnf-in-mysql-8NO_AUTO_CREATE_USER

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

また、誰かがmy.cnfファイルを持っていない場合は、新しいファイルを作成して/etc/my.cnfから上記の行を追加します。


-2

あなたの中でmy.ini、これを書いてください:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

バージョンによって異なります。または:

[mysqld]
sql_mode = ""

または単にこれを削除します: ONLY_FULL_GROUP_BY


-2

WAMPパネルを開き、MySQL構成ファイルを開きます。その中で「sql_mode」を検索し、見つかった場合は「」に設定します。見つからない場合は、sql_mode = ""をファイルに追加します。

MySQLサーバーを再起動すると、準備完了です...

幸せなコーディング。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.