Как сделать вывод одной таблицы, основываясь на вывод другой?

Мне нужно сделать вывод из таблицы в том порядке, в котором выбрал user

1) Сортировка по дате и времени.
2) Сортировка по популярности
3) Сортировать по количеству
4) Сортировать по количеству отзывов
5) Сортировать по цене

Всего я разобрался с 3 задачами: 1, 3 и 5. Для решения других 2 задач, нужно понять строение таблиц.

subject
+-------------+-------------------------------------------------------------------------+---------+
| id_subject  |                                  info                                   | user_id |
+-------------+-------------------------------------------------------------------------+---------+
| 1::serial8  | {"product": ..., "title": ..., "description": ..., "price": ...}::json  | 52::int |
| 2::serial8  | {"product": ..., "title": ..., "description": ..., "price": ...}::json  | 37::int |
  ...

200 row(s)
review
+---------+--------------+-------------+---------+
| rating  |   review     | id_subject  | user_id |
+---------+--------------+-------------+---------+
| 1       | '...'::text  |          2  |     367 |
| 2       | null         |          2  |      94 |
| null    | '...'::text  |          2  |      27 |
| 5       | '...'::text  |          1  |     896 |
  ...
1000 row(s)

Что особенного для второго варианта "Сортировка по популярности", это то, что sql запрос

SELECT sum(rating) / count(*) FROM review WHERE review notnull GROUP BY id_subject; сделает вывод как положено, но при этом не так как нужно мне.

А вот запрос SELECT info::json->>'title', info::json->>'price' FROM subject ORDER BY ( SELECT sum(rating) / count(*) FROM review WHERE review notnull GROUP BY id_subject ) ASC;

выведет ошибку ERROR: more than one row returned by a subquery used as an expression

Я понял, это все потому что, где либо rating is null или возможно вообще не существует запись с данным subject_id. Но мне кажется, вместо этой ошибки postgres могла бы вывести значения равные нулю.

Аналогично для варианта "Сортировка по количеству отзывов". Я сразу покажу свой запрос который выведет ту же ошибку, что и ранее. SELECT id_subject, info::json->>'product', info::json->>'price' FROM subject ORDER BY (SELECT count(*) FROM review WHERE review notnull GROUP BY id_subject) ASC;


Ответы (0 шт):