Как сделать вывод одной таблицы, основываясь на вывод другой?
Мне нужно сделать вывод из таблицы в том порядке, в котором выбрал 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;