我正在使用 PostgreSQL。我有以下架构:
CREATE TABLE users (
id int PRIMARY KEY
);
CREATE TABLE trips (
id int PRIMARY KEY,
driver_id int,
FOREIGN KEY driver_id REFERENCES users(id)
);
CREATE TABLE trip_passengers (
id int PRIMARY KEY,
user_id int,
trip_id int,
FOREIGN KEY trip_id REFERENCES trips(id)
FOREIGN KEY user_id REFERENCES users(id)
);
CREATE TABLE feedbacks (
id int PRIMARY KEY,
trip_id int,
rater_id int,
ratee_id int,
review TEXT,
FOREIGN KEY trip_id REFERENCE trips(id),
FOREIGN KEY rater_id REFERENCES users(id),
FOREIGN KEY ratee_id REFERENCES users(id),
UNIQUE (trip_id, rater_id, ratee_id)
);
以下是以下规则:
- 旅行可以包含多个乘客(通过 trip_passengers 表)。
- 如果他们一起旅行,用户只能进行评论。
- 司机可以对乘客进行评论。
- 乘客也可以对司机进行评论。
- 乘客可以对乘客进行评论。
案例:
表:用户
| id | username |
|-----+------------+
| 1 | driver |
| 2 | passenger1 |
| 3 | passenger2 |
表:行程
| id | driver_id |
|-----+-----------+
| 1 | 1 |
表:trip_passengers
| id | trip_id | user_id |
|-----+---------+---------+
| 1 | 1 | 2 |
| 2 | 1 | 3 |
假设我想从尚未审查的乘客 1 的司机那里获得所有旅行。那将返回行程#1。
如果司机对乘客 1 进行评论,然后再次运行查询,它将不会返回任何内容。
乘客的情况相同,如果我想获得乘客 1 和乘客 2 尚未审查的所有行程,我将获得行程 #1,因为他们都乘坐相同的行程。
如何将特定用户的所有行程返回给尚未审核的其他用户?
这是我最后一次尝试,但有些情况没有遇到。
SELECT trips.* FROM trips
INNER JOIN trip_passengers AS t1 ON t1.trip_id = trips.id
INNER JOIN trip_passengers AS t2 ON t1.passenger_id = :rater_id AND
t2.passenger_id = :ratee_id AND t1.trip_id = t2.trip_id
LEFT JOIN feedbacks ON feedbacks.trip_id = trips.id AND
feedbacks.rater_id = t1.passenger_id
WHERE feedbacks.review IS NULL