くだらないタイトルでごめんなさい。例を挙げて説明します。
いいねテーブルがあり、各いいねのエントリがあるとします
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の質問のために何かを単純化しすぎることを教えてくれます...ありがとう!