8

forms次の構造を持つ名前のテーブルがあります-

GROUP       | FORM       | FILEPATH
====================================
SomeGroup   | SomeForm1  | SomePath1
SomeGroup   | SomeForm2  | SomePath2
------------------------------------

次のクエリを使用します-

SELECT * FROM forms GROUP BY 'GROUP'

最初の行のみを返します-

GROUP       | FORM       | FILEPATH
====================================
SomeGroup   | SomeForm1  | SomePath1
------------------------------------

両方 (またはすべて) を返すべきではありませんか? それとも私は(おそらく)間違っていますか?

4

9 に答える 9

19

マニュアルには次のように記載されています。

標準 SQL では、句を含むクエリは、GROUP BY句で指定されていない選択リスト内の非集計列を参照できませんGROUP BY。たとえば、次のクエリは標準 SQL では無効です。これはname、選択リストの列が に表示されないためGROUP BYです。

SELECT o.custid、c.name、MAX(o.payment)
  FROM 注文 AS o、顧客 AS c
  WHERE o.custid = c.custid
  GROUP BY o.custid;

クエリを有効にするにはname、選択リストから列を除外するか、GROUP BY句で指定する必要があります。

MySQL は の使用を拡張して、選択リストが句GROUP BYで指定されていない非集計列を参照できるようにします。GROUP BYこれは、前述のクエリが MySQL で有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、 で指定されていない各非集計列のすべての値がGROUP BY各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。

あなたの場合、MySQL はグループ化操作を正しく実行していますが、(クエリをグループ化していない列を含むすべての列を選択しているため) 各グループから不確定な 1 つのレコードが得られます。

于 2012-05-31T09:18:17.037 に答える
6

列の値が同じであるため、1行しか返されませGROUPん...これが基本的な仕組みGROUP BYです。

ところで、 、、などGROUP BYの他の列に集計関数を使用するのは良い形式です。MySQL では、列名を指定するだけで、通常、各グループの最初の行が返されます。ただし、他のデータベースはそれを好まないでしょう。COUNT()MIN()MAX()

于 2012-05-31T09:22:17.633 に答える
1

あなたのコード:

SELECT * FROM forms GROUP BY 'GROUP'

あまり「良い」SQLではありません。MySQLではそれを回避でき、groupby句で言及されていないすべての列に対して1つの値のみを返します。他のほとんどのデータベースはこのクエリを実行しません。原則として、グループ化条件の一部ではない列は、集計関数で使用する必要があります。

于 2012-05-31T09:20:38.070 に答える
0

盲目すぎて見えなかった明らかな間違いを指摘してくれてありがとう。私はついに置き換えGROUP BYて、希望する結果を得るための句をORDER BY含めました。WHEREそれは私がずっと使うつもりだったものです。愚かな私。

私の最後のクエリはこれになります-

SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'
于 2012-05-31T09:31:52.180 に答える
0

クエリ結果は完璧です。1行のみを返します。

于 2012-05-31T09:20:04.543 に答える
0

上記の結果はある程度正しいですが、完全ではありません。

GROUP BYステートメントの一部ではない選択したすべての列は、何らかの関数 ( MySQL ドキュメントの集計関数のリスト) によって集計する必要があります。ほとんどの場合、数値列と一緒に使用されます。

GROUP BYこれに加えて、クエリは、ステートメントで参照される列の属性 (の組み合わせ) ごとに 1 つの出力行を返します。あなたの場合、GROUP列には「SomeGroup」という個別の値が1つしかないため、出力にはこの値の行が1つだけ含まれます。

于 2012-05-31T09:21:57.347 に答える
0

Group by、、、、maxなどminのグループ関数がクエリ式に適用されている場合にのみ、句が必要です。クエリには、そのような関数は表示されません。つまり、実際には句は必要ありませんでした。このような句を引き続き使用すると、グループ化された結果から最初のレコードのみが返されます。 avgsumGroup by

したがって、クエリの出力は完璧です。

于 2012-05-31T09:22:17.550 に答える
0
SELECT * FROM forms GROUP BY `GROUP` 

あなたのクエリが機能するのは奇妙です

于 2012-05-31T09:20:50.253 に答える