2016-03-04 75 views
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_idsitter_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_idsitter_id比赛
  • 预订ID字段,如果预订存在但没有消息

它正常工作,但尝试不同的JOINS后,我看到相同的结果。任何情况下,它可以打破?

+2

你的查询似乎是做你想做的事情。内部连接会失败第三个项目符号点。 –

回答

6

你说的意思是:

而且它工作正常,但在尝试不同的JOINS后,我看到同样的结果。任何情况下,它可以打破?

看来你在英文意义上使用“distinct”一词,而不是SQL意思,这在SQL问题中有点令人困惑。

你在加入什么?

  • 任何左边的连接到其他表应该没有效果,可能是您的宠物表的例外。
  • 如果未找到用户/坐席,则加入用户或坐席表可能会导致查询无法正常工作。

我想收到预约ID字段,如果预订存在,但一直没有消息

您要选择的列将导致空预约ID,如果没有消息的方式预订。

  • 考虑上市的所有列手动

请参阅我的简化SQLFiddle http://sqlfiddle.com/#!15/8b976/2
请,也考虑澄清你的问题。

相关问题