我正在根据用户来自另一个表的电子邮件从一个表中查找地址,然后获取结果的地址列表,并检查该地址是否具有存储在第三张表中的属性。该属性在第三张表上可能存在也可能不存在。如果可以,我希望sql打印出“属性存在”,如果不可以,则打印出“属性不存在”
属性通过地址ID链接到地址,而用户通过用户ID链接到地址。
这是我到目前为止所拥有的:
select b.street, case
when c.entity_id = b.entity_id and c.attribute_id = 100 then 'Attribute Exists'
else 'Attribute Doesn't Exist'
end as isValue
from customer_entity as a, //Customer Details
customer_address_entity as b, //Address Details
customer_address_entity_int as c //Address Attribute
where a.email = 'customeremail@example.com'
and a.entity_id = b.parent_id
我在使用此特定设置时遇到的问题在表c中。如果包含它,则我尝试从循环中获取此信息的3个地址的次数与我在表c中存储的属性的数量相同(在这种情况下,是10倍,因为表c中有10条记录,所以当我只想要3时,我得到30个结果。
我不能过滤表c中的结果,因为可能不匹配,但是我想用任何一种方式打印结果。对于选择情况,我也需要表c。如果我摆脱了表c,那么只会显示我想要结果显示的三个地址,但是我无法比较表c中的值。
简而言之,这就是我需要打印的内容:
street isValue
Street 1 Attribute Exists
Street 2 Attribute Exists
Street 3 Attribute Doesn't Exist
答案 0 :(得分:1)
我认为这样写您的查询会更容易理解
:select distinct
b.street,
case
when c.attribute_id = 100 then 'Attribute Exists'
else 'Attribute Doesn''t Exist'
end as isValue
from customer_entity as a //Customer Details
join customer_address_entity as b //Address Details
on a.entity_id = b.parent_id
left join customer_address_entity_int as c //Address Attribute
on c.entity_id = b.entity_id
where a.email = 'customeremail@example.com'
您可以将b
与c
一起加入。如果c.attribute=100
是因为记录已合并,所以如果没有,则此字段将始终为NULL
。
我之所以加入distinct
是因为与c
的左侧联接。