加入3个条件表

时间:2015-11-07 14:54:00

标签: mysql sql mysqli

需要从3个表中获得结果。

表1:用户

Attr。:user_id,user_code,active

表2:user_addresses

Attr。:user_address_id,user_id,[地址字段],有效

表3:user_details

Attr。:user_detail_id,user_id,[详细信息字段],有效

active是布尔字段。在user_addressesuser_details中,user_id可以包含多行(比如3行)。 2行将active字段设置为0(不活动)。第3行是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. 中的有效行
  4. 如果user_addressesuser_details表中没有活动行/没有记录,我只想返回包含NULL值的列名。

1 个答案:

答案 0 :(得分: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子句的原因是因为没有匹配时会发生什么。值为NULLWHERE条件失败。