我在PostgreSQL数据库中有三个表:用户,活动,场地。
Users:
- id
- name
Visits:
- id
- user_id
- location_id
Venues:
- id
- name
如果用户尚未访问某个位置,我想检索特定用户的所有活动。我尝试了一些加入:
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
我希望当用户没有访问某个位置时(=活动中没有条目),访问变量包含0,如果用户访问过该位置,我希望活动数量。
但我只获得用户访问过的位置:
venue | visits
1 3
2 4
3 22
4 1
我想,RIGHT OUTER JOIN
将从右侧返回所有条目,但事实并非如此。
答案 0 :(得分: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
答案 1 :(得分:2)
检查出来:
http://db.apache.org/derby/docs/10.2/ref/rrefsqlj57522.html
基本联接解释 - 它们可能令人困惑。我想你要么想要在第一次连接中切换列,要么使用左外连接。