需要从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_addresses
和user_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
这次我得到第一行(不活动),而不是活动的。
我真正需要的是:
user_addresses
和user_details
表user_addresses
和user_details
表中没有活动行/没有记录,我只想返回包含NULL值的列名。答案 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
子句的原因是因为没有匹配时会发生什么。值为NULL
,WHERE
条件失败。