如何使用外连接和笛卡尔积来连接三个表

23t*_*tux 2 sql database postgresql

我在PostgreSQL数据库中有三个表:用户,活动,场地.

Users:
- id
- name

Visits:
- id
- user_id
- location_id

Venues:
- id
- name
Run Code Online (Sandbox Code Playgroud)

我想检索特定用户的所有活动,如果用户尚未访问某个位置,则检查该事件.我尝试了一些连接:

SELECT venues.id as venue, COUNT(activities.id) as visits
FROM users
RIGHT OUTER JOIN activities ON users.id=activities.user_id
RIGHT OUTER JOIN venues ON activities.venue_id=venues.id
WHERE users.id=1234
GROUP BY venues.id
ORDER BY venues.id
Run Code Online (Sandbox Code Playgroud)

我希望当用户没有访问某个位置时(=活动中没有条目),访问变量包含0,如果用户访问过该位置,则活动计数.

但我只获得用户访问过的位置:

venue | visits
  1       3
  2       4
  3       22
  4       1
Run Code Online (Sandbox Code Playgroud)

我想,RIGHT OUTER JOIN将从右侧返回所有条目,但事实并非如此.

Pau*_*sik 8

LEFT OUTER JOIN意味着您希望左手表中的所有实体是否满足JOIN条件(或谓词).

但这也是极少数情况下笛卡尔积(CROSS JOIN)实际上是必要的,因为你想看到每个用户的每个场地.尝试使用CROSS JOIN,如下所示:

SELECT v.id as venue, COUNT(a.id) as visits
FROM users AS u
CROSS JOIN venues as v --<-- CROSS JOIN for Cartesian product between users and venues
LEFT JOIN activities AS a ON u.id = a.user_id AND a.venue_id = v.id
WHERE u.id = 1234
GROUP BY v.id
ORDER BY v.id
Run Code Online (Sandbox Code Playgroud)