2012-02-12 6 views
1

私はzone_idを格納するテーブルを持っています。ゾーンIDがデータベースで2回表示されることがあります。私はテーブル内の同じzone_idの2つ以上のエントリを持つエントリだけを表示するクエリを書いた。 LAST_UPDATEDかのcompany_idによってIグループは、それがランダムな値を返す場合、しかしSQLでは、count()を使用しているときにgroup byを変更するのはなぜですか?

select *, count(zone_id) 
from proxies.storage_used 
group by zone_id desc 
having count(zone_id) > 1; 

次のクエリは、正しい結果を返します。 group by節を追加しないと、以下のスクリーンショットのように1つの値しか表示されません。クエリ文字列上の最初の出力が示すように、第2の出力はライン「でグループ」することなく、同じクエリ文字列を示しており、一つの値だけを返します。

補正私は新しいメンバーですので、画像を直接投稿することはできませんがだから私はマイナスにそれを加えました:http://min.us/m3yrlkSMu#1o

私の質問はうまくいきませんが、私はその理由を理解していません。誰かが私がグループ出力がグループ化されているのではなく、実際の出力を変更している理由を理解できますか?私はMySQLを使用しています。

答えて

1

group by句がないと、すべてが同じグループに格納されるため、1つの結果が得られます。テーブルに複数の行がある場合は、havingが成功します。だから、あなたはあなたのテーブルのすべての行を数え終わるだろう...

source

私が得たものから、あなた 2つのだけの状況でhavingとし、group byせずにクエリを作成することができます。

  1. あなたはwhere句があり、その句を満たすすべての行の集計で条件をテストするとします。

  2. 上記と同じですが、テーブル内のすべての行についてです(実際には意味がありません)。

2

group byは、結果の行をグループに分割し、各グループのレコードに対して集約関数を実行します。グループなしでカウント(*)を行うと、テーブル内のすべての行が1つカウントされます。グループを指定していないので、グループには1つだけあり、すべてのレコードがテーブルにあります。ゾーンIDでグループをカウント(*)すると、ゾーンIDごとにレコード数がカウントされます。ゾーンIDと最終更新日のカウント(*)を行うと、各ゾーンの各日付に更新された行の数が取得されます。

関連する問題