私が実行しようとしている最も単純なクエリがあります
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 )
デバッグに関する注意
これら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;
_
うまくいけば、すべてが理にかなっていると思いますが、頭を回すのは少し混乱します
group by
ステートメントはcount
( Bug#26209 )の後に実行されます:
DB::table('user_visits')->distinct('user_id')->count('user_id');
別の mySql answer ここに。