2016-03-04 38 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
請,也考慮澄清你的問題。

相關問題