Показать возможные объединения в результате в Postgres - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть таблицы с пользователями (user_id, user_name), продуктами (product_id, product_name) и представлениями (user_id, product_id, timestamp) этими пользователями этих продуктов.

Теперь я хочу отобразить матрицу со ссылками все Продукты и все Пользователи, если они видели продукты (0 или 1). Таким образом, при наличии 2 пользователей и 3 продуктов результат может выглядеть следующим образом:

+---------+------------+------+
| user_id | product_id | seen |
+---------+------------+------+
| 1       | 1          | 0    |
+---------+------------+------+
| 1       | 2          | 0    |
+---------+------------+------+
| 1       | 3          | 1    |
+---------+------------+------+
| 2       | 1          | 1    |
+---------+------------+------+
| 2       | 2          | 0    |
+---------+------------+------+
| 2       | 3          | 0    |
+---------+------------+------+

Но как? Я могу получить только пользователей и продукты, которые были просмотрены, потому что они «присоединяются» к таблице представлений.

1 Ответ

0 голосов
/ 03 сентября 2018

Попробуйте перекрестно соединить таблицу пользователей и продуктов, затем оставьте соединение с таблицей соединений:

SELECT
    u.user_id,
    p.product_id,
    CASE WHEN v.timestamp IS NOT NULL THEN 1 ELSE 0 END AS seen
FROM Users u
CROSS JOIN Products p
LEFT JOIN Views v
    ON u.user_id = v.user_id AND p.product_id = v.product_id;

Если в таблице Views может быть несколько записей для данной комбинации пользователь / продукт, и вы хотите сообщить о видимом событии только один раз, тогда вы можете использовать SELECT DISTINCT с вышеуказанным запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...