I have the following table members
:
album_id | user_id
-------------------
1 1
1 2
1 4
2 1
2 4
4 1
5 3
with a unique constraint on (album_id, user_id)
.
I'd like to get the count of how many users there are per gallery, but only if the gallery contains a given user.
So for instance if I get all rows with user_id = 4
, I'd like to get a result like
album_id | count(user_id)
-------------------------
1 3
2 2
CodePudding user response:
SELECT album_id, count(*) AS ct
FROM tbl t
JOIN tbl t1 USING (album_id)
WHERE t.user_id = 4
GROUP BY 1
ORDER BY 1; -- optional
I chose this form, out of many possible solutions, because it can use an index on (user_id)
.
For best performance, you have two indexes: one on (user_id, album_id)
, and another one on (album_id)
(or a multicolumn index with album
as leading column). See:
Assuming user_id
is NOT NULL
, so count(*)
is equivalent, but faster. See: