Запрос Postgresql -Упорядочивание по результатам подзапроса

У меня есть запрос, в котором я хочу выбрать всех пользователей, которым нравится данный набор исполнителей. Есть также некоторые другие критерии 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. Есть предположения?

7
задан johnnymire 4 May 2012 в 10:54
поделиться