mysql - 具有多个独立左连接的单个查询
问题描述
我有两张桌子。一个用于元素(潜在客户),一个用于该元素属性(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
非常感谢。
解决方案
您可以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
推荐阅读
- c++ - 在哪些情况下,来自 std::forward 的赋值优于来自 std::move 的赋值?为什么?
- big-o - 当 j=i 时对嵌套循环 Big-O 运行时感到困惑
- python - 使用上一页的参数初始化 Django 表单
- css - 背景颜色引导程序不会占用整页的宽度
- git - 使用 git rebase 忽略顽皮文件
- android - 谷歌地图 API 密钥 - Android
- javascript - 将记录添加到不同的选项卡
- php - 在 Codeigniter 中将数组从控制器发送到模型的问题
- excel - 范围为工作簿的 Excel 命名范围从工作表范围命名范围打印
- woocommerce - WooCommerce 迷你购物车的数量选择器/输入