繁体   English   中英

根据列值从多个表进行联接

[英]Joining from multiple tables based on column value

我有以下表格:

objects:
**************************************************
object_type | object_name | object_id | value
campaign    | my_campaign | 1         | my_value
ad set      | my_adset    | 1         | adset_value
ad          | my_ad       | 1         | ad_value
**************************************************

campaigns:
******************
id | name
1  | my_campaign
******************

adsets:
***************************
id | name     | campaign.id
1  | my_adset | 1
***************************

ads:
**********************
id | name  | adset.id
1  | my_ad | 1
**********************

对象中的object_id可以是:

campaigns.id if object_type = "campaign"
adsets.id if object_type = "ad set"
ads.id if object_type = "ad".

我想返回以下几列:

object_type, object_id, value, campaign, adset, ad

所以:

if object_type is:
  "campaign": then campaign=object_name, adset = "", ad =""
  "adset": then campaign = adsets.campaign_id, adset = object_name, ad=""
  "ad": then campaign = adsets.campaign_id, adset = ad.adset.id, ads = object_name

在上面的示例中,它应该返回:

*************************************************************************
object_type | object_id | value       | campaign    | adset    | ad
campaign    | 1         | my_value    | my_campaign |          |
ad set      | 1         | adset_value | my_campaign | my_adset |
ad          | 1         | ad_value    | my_campaign | my_adset | my_ad
*************************************************************************

我不确定该怎么做。

我尝试过这样的事情:

select 
    object_type,
    object_id,
    value,
    campaigns.name as campaign,
    adsets.name as adset,
    ads.name as ads
from 
   objects, campaigns, adsets
Left outer join ads on
   adsets.campaign_id = campaigns.id and ads.adset_id = adsets.id and objects.object_id = ads.id
left outer join adsets on
   adsets.campaign_id = campaigns.id and objects.object_id = ads.adsets

但它不起作用,对于广告系列object_type来说,我也不需要进行加入。

UNION是您的朋友:

SELECT o.object_type, o.object_id, o.value, c.name, s.name, a.name
   FROM objects o
        JOIN ads a ON o.object_id = a.id
        JOIN adsets s ON a.adset_id = s.id
        JOIN campaigns c ON s.campaign_id = c.id
   WHERE o.object_type = 'ad'
UNION SELECT o.object_type, o.object_id, o.value, c.name, s.name, NULL
   FROM objects o
        JOIN adsets s ON o.object_id = s.id
        JOIN campaigns c ON s.campaign_id = c.id
   WHERE o.object_type = 'ad set'
UNION SELECT o.object_type, o.object_id, o.value, c.name, NULL, NULL
   FROM objects o
        JOIN campaigns c ON o.object_id = c.id
   WHERE o.object_type = 'campaign';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM