web-dev-qa-db-ja.com

DB-> count()はcount(DB-> get())とは異なる値を返します

私が実行しようとしている最も単純なクエリがあります

DB::table('user_visits')->groupBy('user_id')->count();

しかし、それは間違った数、8を返します。

これに変更すると:

count(DB::table('user_visits')->groupBy('user_id')->get());

次に、正しい数値34を返します。なぜこれらは同じ値ではないのですか?

これが私のテーブル構造です

user_visits( user_id, date_visited, num_clicks )
9
andrewtweber

デバッグに関する注意
これら2つの異なるアプローチで生成されたクエリは完全に異なり、これがあなたに起こっている理由です。 DBの問題が発生した場合は常に、基になるクエリログを確認することをお勧めします。これにより、次のようにして実行内容を確認できます。

_dd(DB::getQueryLog());
_

クエリログを出力します。問題のあるルックアップの直後に実行すると、最新のクエリのログの最後に移動できます(つまり、2番目のルックアップの後にログを配置した場合、ログの最後のクエリはあなたのラップされたカウンターであり、最後の1つのクエリはcountメソッドです)。

あなたの特定の問題
とにかく、特定の問題を説明します。生成される2つのクエリは次のようになります

_DB::table('user_visits')->groupBy('user_id')->count();
// SELECT COUNT(*) from user_visits GROUP BY user_id
_

これにより、各グループのエントリ数が返されます。 mysqlが実行していることは、user_idカラムですべての行をグループ化し、グループごとに1つの行をカウントで返します。 「user_id」を選択のために列に追加し、データベースに対して手動でクエリを実行すると、結果として次のようなものが表示される可能性があります

_// SELECT user_id, COUNT(*) FROM user_visits GROUP BY user_id

----------------------
| user_id | COUNT(*) |
----------------------
| 1       | 8        |
| 2       | 4        |
| 5       | 11       |
----------------------
_

2番目のクエリは異なります

_DB::table('user_visits')->groupBy('user_id')->get()
// SELECT * FROM user_visits GROUP BY user_id
_

これは、すべてのエントリを選択し、グループ化して返すだけです。その結果、ユーザーIDごとに1行が返され、その行には、そのuser_idの1つのエントリのすべての情報が含まれます(これは、そのユーザーの最初のエントリの場合もあれば、最後のエントリの場合もあり、ランダムな場合もあります) 、それは問題ではありません)。

次に、count()は、返された行の数をカウントします。これは、一意のuser_idのカウントになります。

したがって、最初のクエリは、グループごとのuser_idの数を数えています(そしてlaravelは、結果を印刷しようとすると最初のレコードを返し、最初のuser_idのエントリ数が表示されます結果セットで)、2番目のクエリ(および適用されたcount関数)は、見つかったグループの数(つまり、一意のuser_idの数)を返します。

これを説明するために上から私のテーブルを使用して...

クエリ1:結果セットの最初のエントリに対して、カウントである「8」を返します。
クエリ2:結果セットの行数に対して、カウントである「3」を返します

すべてのデータをロードせずに、正しい数が必要ですか?
2番目のクエリに従って正しい結果が必要で、クエリ1の軽量でネットワーク負荷の少ない単一の整数の応答が必要な場合は、次のようにします。

_DB::table('user_invites')->count(DB::raw('DISTINCT user_id'))
_

その結果:

_SELECT COUNT(DISTINCT user_id) FROM user_visits;
_

うまくいけば、すべてが理にかなっていると思いますが、頭を回すのは少し混乱します

32
Lee

group byステートメントはcountBug#26209 )の後に実行されます:

DB::table('user_visits')->distinct('user_id')->count('user_id');

別の mySql answer ここに。

3
The Alpha