私は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 を持つドライバーからのすべての旅行を取得したいとします。これは trip#1 を返します。
ドライバーが乗客 1 にレビューを行い、クエリを再度実行すると、何も返されません。
乗客の場合も同じです。まだ確認していない乗客 2 を持つ乗客 1 のすべての旅行を取得したい場合、両方が同じ旅行に乗るため、旅行 #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