1
我有以下模式:可以使用不同的JOIN類型給出相同的結果嗎?
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(40) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE sitters (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users ON DELETE CASCADE UNIQUE NOT NULL,
slug VARCHAR(255) NOT NULL,
headline VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE bookings (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users ON DELETE CASCADE,
sitter_id UUID REFERENCES sitters,
start_date date NOT NULL,
end_date date NOT NULL,
pets_ids UUID[] NOT NULL,
status VARCHAR(15) NOT NULL DEFAULT 'created',
total_amount_cents INT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE messages (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
booking_id UUID REFERENCES bookings ON DELETE CASCADE,
sender_id UUID REFERENCES users ON DELETE CASCADE,
receiver_id UUID REFERENCES users ON DELETE CASCADE,
content TEXT NOT NULL,
seen_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
所以:
- 用戶可以是一個保姆。
- 預訂有一個用戶和一個保姆。
- 消息屬於一個唯一的預訂。
我想:
給定一個user_id
,如果和booking_id
回報預訂的sitter_id
消息:
booking_id
有效- ,預訂ID匹配給定
user_id
,sitter_id
或兩者。
所以我就:
SELECT m.*,
b.user_id, b.sitter_id
FROM bookings b
LEFT JOIN messages m
ON m.booking_id=b.id
WHERE b.id=$1 AND (b.user_id=$2 OR b.sitter_id=$3);
我想收到:
- 什麼,如果預訂不存在
- 沒有什麼是沒有的
user_id
或sitter_id
比賽 - 預訂ID字段,如果預訂存在但沒有消息
它正常工作,但嘗試不同的JOINS後,我看到相同的結果。任何情況下,它可以打破?
你的查詢似乎是做你想做的事情。內部連接會失敗第三個項目符號點。 –