2015-11-07 78 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