1

古い W​​eb サイトを更新していますが、クエリの 1 つが機能しなくなりました。

SELECT * FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2

ドロップした場合は機能することに気付きましたGROUP BYが、結果セットは元のものと一致しません:

SELECT * FROM tbl WHERE col1 IS NULL ORDER BY col2

そこでGROUP BYドキュメントを読んで何が問題なのかを確認しようとしましたが、すべてのフィールドを選択するのではなく、列名を明示的に使用することを提案しているように見えた*ので、順序付けおよびグループ化されている列だけで試しました:

SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2

これは機能しますが、コードを調べた後、クエリにはクエリに2つの列が必要なので、追加した人は誰でも*やりすぎましたが、その列を追加するとエラーが発生し、同様に3番目の列を追加すると同じエラーが発生します:

SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2
SELECT col1, col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2

この最後のクエリが機能しない理由を誰か教えてもらえますか? docsから理由を解読することはできませんが、これは必要な結果セットを取得するために必要な最小限のクエリです。

管理者でクエリを実行すると、このエラーが発生します

Error in query (1055): Expression #2 of SELECT list is not in GROUP BY 
clause and contains nonaggregated column 'name.table.column' 
which is not functionally dependent on columns in GROUP BY clause; this is 
incompatible with sql_mode=only_full_group_by
4

5 に答える 5

3

の使用には注意が必要ですGROUP BY。何GROUP BYが機能するかを理解すれば、問題を自分で理解できます。データの集計を行います。つまり、未加工のエントリに対して何らかの操作を実行し、集計関数 (SUM、COUNT、AVG など) が適用された新しい削減された数のエントリを作成することにより、データを削減します。

句で指定するフィールドは、目的GROUP BYの集計/ロールアップのレベルを表します。

SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

ここでは、レベルで集計を実行しようとしていcol1ます。つまり、 column に存在する個別の値ごとに、句 (here , )col1で指定した他の列に対して何らかの操作が行われるため、出力に繰り返しのない値が含まれます。適用する関数 (SUM、COUNT、AVG など) に基づいて、それぞれの個別の値のロールアップされた値とそれに対するロールアップされた値。SELECTcol2col3col1col2col3col1

この関数をどのように適用しますか? それが、上記のクエリに欠けているものです。SELECTそれを解決するには、句には存在するが句には存在しないフィールドに集計関数を適用する必要がありますGROUP BY。SUM の例を挙げて、これを試してください。

SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

または、より良いアイデアとして、WHEREフィルターを削除し、次を実行して出力を確認します。

SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1

さらに、他のクエリの理由

SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2

機能したのは、句col2に存在するフィールド(ここでは)に集計を適用する必要がないためです。GROUP BY

于 2017-12-07T18:47:23.267 に答える