首页 > 解决方案 > 具有多个独立左连接的单个查询

问题描述

我有两张桌子。一个用于元素(潜在客户),一个用于该元素属性(leads_properties)。

对解决此问题有用的潜在客户表列是:id、token。属性表是这样的:

id      label      value
1       phone      555333666
3       phone      111222555
3       city       Milan

我正在尝试通过单个查询提取潜在客户和所有请求的属性。如果我询问城市,我将检索所有加入智慧城市财产的线索信息,如果我询问城市和电话,我将检索甚至电话。

我正在尝试的查询是:

SELECT leads.* ,
p1.value as 'phone' ,
p2.value as 'city'
FROM leads
LEFT JOIN leads_properties as p1 ON leads.id = p1.lead_id 
LEFT JOIN leads_properties as p2 ON leads.id = p2.lead_id 
WHERE leads.id = 1 
AND p1.label = 'phone' 
AND p2.label = 'city' 
AND leads.token = 'xxxxx'
LIMIT 1

如果所有请求的属性都存在于 DB 中(在此示例中为线索 id=3)但失败并为没有“城市”属性的线索 id=1 返回 0 行,这将非常有效。

我明白为什么(WHERE 语句中的 AND 子句可能是限制性的)但我不明白如何解决这个问题。

我想像这样检索一行(如果所有请求的属性都在数据库中)

id   token        city      phone
3    xxxxx        Milan     111222555

如果某些请求的属性不在 DB 中,或者像这样(具有空值或 NULL 值):

id   token        city      phone
1    xxxxx                  111222555

非常感谢。

标签: mysqljoinleft-join

解决方案


您可以conditional aggregation使用case when expression

SELECT leads.id,max(case when p1.label = 'city' then p1.value end) as city
max(case when p1.label = 'phone' then p1.value end) as phone
FROM leads
LEFT JOIN leads_properties as p1 ON leads.id = p1.lead_id
WHERE leads.id = 1 
group by leads.id

推荐阅读