在Postgres中显示结果中现有的可能联接

时间:2018-09-03 13:38:23

标签: postgresql

我有一些表,这些表包含这些产品的这些用户的用户(用户ID,用户名),产品(产品ID,产品名)和视图(用户ID,产品ID,时间戳)。

现在,我想显示一个矩阵,引用所有产品和所有用户,以及他们是否看过产品(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 :(得分:1)

尝试交叉连接用户和产品表,然后将其左连接到联结表:

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