27

サイトは結果を生成しますが、SELECT COUNT と GROUP BY を使用した SELECT クエリでは 2 つの異なる結果カウントが得られます。これは、phpmyadmin に表示されているがサイトには表示されていないエラーが原因である可能性があります。

クエリ:

SELECT count(DISTINCT `name`) as `numrows` FROM `users` WHERE `verified` = '1'

SELECT `name`, `type`, `language`, `code` FROM `users` WHERE `verified` = '1' GROUP BY `name` ORDER BY `count` DESC LIMIT 0, 25

PhpMyAdmin は次のエラーを提供します。

1055 - 「main.users.type」は GROUP BY にありません

MySQL のドキュメントを読んでいても、何を修正しなければならないのかまだわかりません。これが理解できそうにありません。

4

5 に答える 5

44

次の方法で完全なグループを作成する必要があります。

SELECT `name`, `type`, `language`, `code` 
FROM `users` 
WHERE `verified` = '1' 
GROUP BY `name`, `type`, `language`, `code` 
ORDER BY `count` DESC LIMIT 0, 25

SQL92 では、select 句のすべての列 (集計を除く) が group by 句の一部である必要があります。SQL99 では、この制限が少し緩和され、select 句のすべての列が機能的に group by 句に依存している必要があると規定されています。デフォルトでは、MySQL は部分的なグループ化を許可しており、これにより非決定論的な回答が生成される場合があります。次に例を示します。

create table t (x int, y int);
insert into t (x,y) values (1,1),(1,2),(1,3);
select x,y from t group by x;
+------+------+
| x    | y    |
+------+------+
|    1 |    1 |
+------+------+

つまり、グループ x に対してランダムな y が選択されます。@@sql_mode を設定することで、この動作を防ぐことができます。

set @@sql_mode='ONLY_FULL_GROUP_BY';
select x,y from t group by x; 
ERROR 1055 (42000): 'test.t.y' isn't in GROUP BY
于 2014-09-12T04:20:17.870 に答える
0

まず、なぜそうなのかを確認することです。以前のバージョンでは、少し怠慢でした: グループ化された列の値は結果に完全にリストされていますが (例外なくそれぞれから 1 つ)、他の選択された列の値は多かれ少なかれ省略されています - しかし、コードは't (したくない) あなたに代わってどれを教えてください:

- Hey, MYSQL, list the families of the street - but add a first name as well to every row.
- Okay sir, but shall I use the father's or the mother's or...? I'm a machine, give exact orders!

理由がわかったので、他の列に関して好みがあるかどうかを判断できます。使用する

MAX() AS
MIN() AS
etc, works with strings, too

または、実際にすべて同じである場合、たとえば、グループ化された値に関連する非集計値に違いがない場合は、次を使用します

ANY_VALUE() AS

いずれにせよ、「あいまい」であることを認識していることをmysqlに知らせますが、グループ化した列以外のすべての列に焦点を合わせたくありません。

于 2018-08-31T21:18:44.173 に答える