2015-11-07 85 views
-1

需要從3個表格中獲得結果。以條件連接3個表格

表1:用戶

Attr.:user_id,user_code,活性

表2:user_addresses

的Attr .: user_address_id,USER_ID,[地址字段],活性

表3:user_details

屬性:user_detail_id,user_id,[詳細字段],有效

active是布爾型字段。在user_addressesuser_details中,user_id可以有多行(比如3行)。 2行將active字段設置爲0(無效)。第三行是active字段設置爲1的活動字段。

現在,我想在與user_code一起搜索時加入所有這些表格。我編譯了以下連接查詢:

SELECT "*" FROM "users" 
LEFT JOIN "user_details" AS "ud" USING ("user_id") 
LEFT JOIN "user_addresses" AS "ua" USING ("using_id") 
WHERE "user_code" = 'TRY001' AND "users"."active" = 1 AND "ua"."active" = 1 AND "ud"."active" = 1 

只有當所有表中都有條目時,纔會得到預期的結果。所以我改變了這樣的事情:

SELECT "*" FROM "users" 
LEFT JOIN "user_details" AS "ud" USING ("user_id") 
LEFT JOIN "user_addresses" AS "ua" USING ("using_id") 
WHERE "user_code" = 'TRY001' AND "users"."active" = 1 OR "ua"."active" = 1 OR "ud"."active" = 1 

這次我得到的第一行(這是不活動的),而不是活動的。

我實際上需要的是:

  1. 加入三個表
  2. 僅獲得來自user_addressesuser_details表的有效行
  3. 櫃面沒有活動的行/沒有記錄在user_addressesuser_details表中存在,我只想返回其中包含NULL值的列名稱。
+0

這將是很好,如果我會知道爲什麼它被評爲! – Thamilan

回答

1

當您使用left join,在所有條件,但第一個表需要進入ON條款:

SELECT * 
FROM users u LEFT JOIN 
    user_details ud 
    ON ud.user_id = u.user_id AND ud.active = 1 LEFT JOIN 
    user_addresses ua 
    ON ua.using_id = ud.using_id AND ua.active = 1 
WHERE u.user_code = 'TRY001' AND u.active = 1 ; 

我猜,其中列從,尤其是using_id到來。

這些需要進入ON子句的原因是因爲沒有匹配時會發生什麼。值爲NULL,並且WHERE條件失敗。

+0

哦,這真棒,工作!部分是,我試着用,但不確定部分和錯過了u.active!非常感謝,上帝保佑! – Thamilan