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后,我看到相同的结果。任何情况下,它可以打破?
你的查询似乎是做你想做的事情。内部连接会失败第三个项目符号点。 –