私の最新のプロジェクトには (少なくとも私にとっては) トリッキーなロジックがあり、それを解決するために HAVING
を使用しようとしていますが、すべてのプレイで間違った結果が得られます。 p>
ユーザーをユーザー グループに割り当てるリンク テーブルと、各グループのユーザー数を記録する別のテーブルがあるため、常にカウントする必要はありません (2 番目のテーブルは、ユーザー登録が時間から更新された後に実行されます)時間に)。
私が抱えている問題は、2 番目のテーブルの数値を更新する関数にあります。
リンクされたテーブルは次のようになります。これが私の問題を説明するサンプル データです:
リーリーユーザーは任意の数のグループに所属できます。実際、グループになるには、ユーザーはその下のすべてのグループに所属する必要があります。これは、各グループに特定の権限が割り当てられているためです。これを変更するには、現在のアプリケーションを大幅に書き直す必要があります。
私がやりたいのは、各ユーザーの最上位グループのみをカウントすることです。そのため、上記のデータ例では、ユーザー 1 はグループ 5 でのみカウントされ、グループ 1 は空のように見えます。
現在、すべてのエントリがカウントされます。つまり、グループ 4 に 3 人のユーザーがいる場合、その 3 人のユーザーはグループ 3、2、および 1 にもカウントされるため、私の数字は比較的無意味になります。
これまでに、いくつかのバリエーションを試してみました:
リーリーこれで同じ番号が得られます。それから私は試しました:
リーリーしかし、今では理解していますが、私は他のグループに属していないユーザーにのみ質問しています。
正しい方向に進んでいるように感じますが、どこにどのような条件を設定すればよいのかわかりません。同様のフローのクエリの例をいくつか見てきましたが、エイリアスがすべて混乱を招くだけです。
誰かが私に正しい方向を教えてくれませんか?
集計を使用して各ユーザーの最大
リーリーgroup_id
を取得し、COUNT()
ウィンドウ関数を使用して、返された各ユーザーの最大group_id
> 数をカウントできます。 :このクエリは、メンバーを持たないすべての
group_id
をフィルターで除外します。すべての
簡略化されたgroup_id
の結果が必要な場合は、テーブルgroups
のLEFT
を使用して上記のクエリに接続します。 リーリーデモをご覧ください。