die*_*lar 1 sql postgresql 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()
);
Run Code Online (Sandbox Code Playgroud)
所以:
我想:
给出a user_id,a sitter_id和booking_id返回预订的消息,如果:
booking_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);
Run Code Online (Sandbox Code Playgroud)
我想收到:
user_id或sitter_id比赛它工作正常,但尝试不同的JOINS后,我看到相同的结果.任何可能破坏的场景?
你是什么意思:
它工作正常,但尝试不同的JOINS后,我看到相同的结果.任何可能破坏的场景?
看起来你在英语意义上使用"distinct"这个词,而不是在SQL意义上,这在SQL问题中有点令人困惑.
你加入了什么?
如果预订存在但我没有留言,我想收到预订ID字段
如果没有预订消息,您选择列的方式将导致空的预订ID.
请参阅我的简化SQLFiddle http://sqlfiddle.com/#!15/8b976/2
请同时考虑澄清您的问题.
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |