У меня есть запрос, в котором я хочу выбрать всех пользователей, которым нравится данный набор исполнителей. Есть также некоторые другие критерии WHERE для страны и т. д. Вот как выглядит схема.
users favourite_artists artists
+----------+------------+ +-----------+------------+ +--------+--------+
| id | country | | user_id | artist_id | | id | name |
+----------+------------+ +-----------+------------+ +--------+--------+
| 1 | gb | | 1 | 6 | | 1 | Muse |
| 2 | gb | | 1 | 5 | | 2 | RATM |
| 3 | us | | 1 | 3 | | 3 | ABBA |
| 4 | us | | 2 | 3 | | 4 | U2 |
+----------+------------+ +-----------+------------+ +--------+--------+
Я хочу упорядочить их по количеству артистов, которые им нравятся. Я также хочу включить пользователей, которым не нравится ни один из исполнителей, но которые соответствуют критериям WHERE. Ожидаемый набор результатов будет выглядеть так.
+--------+---------------+----------------+
| id | country | match_count |
+--------+---------------+----------------+
| 6 | gb | 4 |
| 9 | gb | 4 |
| 2 | gb | 3 |
| 1 | gb | 2 |
| 5 | gb | 0 |
| 4 | gb | 0 |
+--------+---------------+----------------+
Я пытался сделать это с помощью подзапроса, чтобы получить количество совпадений _и упорядочить их, но это выполнялось довольно медленно, поэтому я подумал, что должен быть лучший способ.
SELECT users.id, users.country
(SELECT COUNT(*) FROM favourite_artists
WHERE user_id = users.id AND artist_id IN (1,3,4,9)) AS match_count
FROM "users"
WHERE users.country = 'gb'
ORDER BY match_count DESC;
Я использую Postgresql 9.0.7. Есть предположения?