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将从右侧返回所有条目,但事实并非如此.
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)
| 归档时间: |
|
| 查看次数: |
10689 次 |
| 最近记录: |