コメントでa_horse_with_no_nameが提供したリンクに基づいて、私は自分の答えにたどり着きました。
とにかく他の含まれている列に機能的に依存している場合、GROUP BY句から列を除外できるようにするために、MySQLのGROUPBYの使用方法はSQLの方法とは異なるようです。
銀行口座のアクティビティを表示するテーブルがあるとします。それはあまり考え抜かれたテーブルではありませんが、私たちが持っているのはそれだけであり、それが必要になるでしょう。金額を追跡する代わりに、アカウントが「0」から始まり、そのアカウントへのすべてのトランザクションが代わりに記録されると想像します。したがって、金額はトランザクションの合計です。テーブルは次のようになります。
+------------+----------+-------------+
| costumerID | name | transaction |
+------------+----------+-------------+
| 1337 | h4x0r | 101 |
| 42 | John Doe | 500 |
| 1337 | h4x0r | -101 |
| 42 | John Doe | -200 |
| 42 | John Doe | 500 |
| 42 | John Doe | -200 |
+------------+----------+-------------+
「名前」が「costumerID」に機能的に依存していることは明らかです。(この例では、逆の方法も可能です。)
各顧客のcostumerID、名前、現在の金額を知りたい場合はどうなりますか?
このような状況では、2つの非常によく似たクエリが次の正しい結果を返します。
+------------+----------+--------+
| costumerID | name | amount |
+------------+----------+--------+
| 42 | John Doe | 600 |
| 1337 | h4x0r | 0 |
+------------+----------+--------+
このクエリはMySQLで実行でき、SQLに従って有効です。
SELECT costumerID, name, SUM(transaction) AS amount
FROM Activity
GROUP BY costumerID, name
このクエリはMySQLで実行でき、SQLによると合法ではありません。
SELECT costumerID, name, SUM(transaction) AS amount
FROM Activity
GROUP BY costumerID
次の行では、集計操作とGROUP BYを使用するSQLの方法に従う必要があるため、代わりにクエリが返され、エラーが発生します。
SET sql_mode = 'ONLY_FULL_GROUP_BY';
MySQLで2番目のクエリを許可するための引数は、SELECTで言及されているが、GROUP BYでは言及されていないすべての列が、集計操作内で使用されているか('transaction'の場合)、または含まれている他の列に機能的に依存しています(「name」の場合)。'name'の場合、機能的に'costumerID'に依存しているため、すべてのグループエントリに正しい'name'が選択されていることを確認できます。したがって、costumerIDの各グループに名前が1つしかない可能性があります。
GROUP BYを使用するこの方法は、GROUP BY句から除外されているものをさらにチェックしないため、欠陥があるように見えます。特定の列を含めたり除外したりしても意味がない場合でも、SELECTステートメントから列を選択して、適切と思われるGROUPBY句を挿入できます。
セーラーの例は、この欠陥を非常によく示しています。集計演算子を使用する場合(おそらくGROUP BYと組み合わせて)、返されるセットの各グループエントリには、その列ごとに1つの値しかありません。セーラーの場合、GROUP BY句が省略されているため、テーブル全体が1つのグループエントリにまとめられます。このエントリには、名前と最大年齢が必要です。MAX(S.age)は1つの値しか返さないため、このエントリの最大年齢を選択するのは簡単です。ただし、S.snameの場合、SELECTでのみ言及されているため、Sailorテーブル全体(この場合はJohnとJane Doeの2つ)にある一意のsnameと同じ数の選択肢があります。MySQLには何もありませんどちらを選択するかについての手がかり、私たちはそれを与えませんでした、そしてそれは時間内にブレーキをかけなかったので、それは最初に来るものを選ぶだけです(ジェーンドゥ)。2つの行を入れ替えると、実際には誤って「正しい答え」が返されます。MySQLでこのようなことが許可されていること、GROUP BY句で何かが省略されている場合、GROUP BYを使用したクエリの結果がテーブルの順序に潜在的に依存する可能性があることは、まったく馬鹿げているようです。どうやら、それはMySQLが転がる方法です。しかし、それでも、「欠陥のある」クエリのために何をしているのか見当がつかないときに、少なくとも警告の礼儀を持っていることができませんでしたか?確かに、プログラムに間違った指示を与えた場合、それはおそらくあなたが望むように行わない(またはすべきではない)でしょうが、あなたが不明確な指示を与える場合、私は確かにそうしません