くだらないタイトルでごめんなさい。例を挙げて説明します。
いいねテーブルがあり、各いいねのエントリがあるとします
user_id | liked_id
--------------------
1 | a
2 | a
1 | b
2 | c
1ユーザーがアイテムaとを気に入りb、ユーザー2がアイテムaとを気に入ったことを意味しますc。
各アイテムのいいねの総数を取得するには、次のようにします。
SELECT liked_id, COUNT(*)
FROM likes
GROUP BY liked_id
ただし、特定のユーザーが気に入ったアイテムのみを対象とする良い方法はありますか? したがって、たとえば、 user に対してクエリを実行する1と、次のような結果が得られます。
liked_id | count
------------------
a | 2
b | 1
ユーザー1がアイテムaとを気に入ったが、 を気に入らbなかったためcです。
私が考えることができる最善の方法は、JOINまたはINサブセレクトを使用することです。
SELECT l.liked_id, count(*)
FROM likes l
JOIN (
SELECT liked_id
FROM likes
WHERE user_id = 1
) l2
ON l.liked_id=l2.liked_id
GROUP BY l.liked_id;
集約するときに物事をまとめるより良い方法はありますか? できるトリックがあるHAVINGかもしれないと思いますが、そうではないかもしれませんし、とにかく遅い解決策かもしれません.
EDIT:タグがそれを明確にしなかった場合、私はPostgresを使用しています。
編集:すべての回答に感謝します。質問をしたときに、私が最善かつ最速だと思ったものを受け入れました-明らかにすべきだったのですが、全員に+1を付けました。
後で注文できるように、likes テーブルのエントリから別のデータが必要であることを言及する必要がありました。SELECTサブセレクトは、受け入れられた回答がandの部分に追加のエントリと結合するのと同様にそれを行いGROUP BYます。SOの質問のために何かを単純化しすぎることを教えてくれます...ありがとう!