[英]mySQL query joining five tables
我有以下五個表(為簡潔起見省略了一些字段)
(campaign)
campaign_id
===========
campaign_name
campaign_description
(ad_group)
campaign_id
===========
group_id
===========
group_name
(used_ad)
campaign_id
===========
group_id
===========
ad_id
===========
(billboard_group)
campaign_id
===========
group_id
===========
group_name
(used_billboard)
campaign_id
==============
group_id
==============
billboard_code
==============
因此,“廣告系列”由1)“ad_group”和2)“billboard_group”組成。 ad_group包含許多廣告(存儲在“used_ad”組中),而billboard_group包含許多廣告牌(存儲在“used_billboard”組中)。
我想運行一個返回所有廣告系列的查詢,並列出與該廣告系列相關的廣告和廣告牌總數。 我只能為ad_group執行此操作,但不能執行ad_group AND billboard_group。
例如,這個查詢:
SELECT campaign.*, COUNT(used_ad.ad_id) AS used_ads
FROM campaign
LEFT JOIN ad_group
ON campaign.campaign_id = ad_group.campaign_id
LEFT JOIN used_ad
ON ad_group.group_id = used_ad.group_id
AND used_ad.campaign_id = campaign.campaign_id
GROUP BY campaign.campaign_id
給出這樣的列表:
campaign_id campaign_name campaign_description used_ads
1 Test campaign Testing 4
2 Second campaign Second 0
但我所追求的是:
campaign_id campaign_name campaign_description used_ads used_billboards
1 Test campaign Testing 4 5
2 Second campaign Second 0 3
只有我似乎無法弄清楚如何從BOTH used_ad和used_billboard中包含計數。 我會感激任何幫助。
為了避免笛卡爾乘法,我將分別對used_ad
和used_billboard
分組和計數,然后才加入它們:
SELECT campaign.*, ag.used_ads_count, bg.used_billboards_count
FROM campaign c
LEFT JOIN (SELECT campaign_id, COUNT(*) AS used_ads_count
FROM ad_group ag
LEFT JOIN used_ad ua ON ag.group_id = ua.group_id
GROUP BY campaign_id) ac ON c.campaign_id = ac.campaign_id
LEFT JOIN (SELECT campaign_id, COUNT(*) AS used_billboards_count
FROM billboard_group bg
LEFT JOIN used_billboard ub ON bg.group_id = ub.group_id
GROUP BY campaign_id) bc ON c.campaign_id = bc.campaign_id
如果billboard_code是唯一的,這樣的東西可能會有效:
SELECT
c.campaign_id, c.campaign_name,
COUNT(DISTINCT u.ad_id) AS used_ads,
COUNT(DISTINCT b.billboard_code) AS used_billboards
FROM
campaign c
LEFT JOIN ad_group a ON c.campaign_id = a.campaign_id
LEFT JOIN used_ad u ON a.group_id = u.group_id
AND c.campaign_id = u.campaign_id
LEFT JOIN used_billboard b ON c.campaign_id = b.campaign_id
AND b.group_id = a.group_id
GROUP BY c.campaign_id
SELECT campaign.*, COUNT(used_ad.ad_id) AS used_ads, COUNT(used_billboard.billboard_code) as used_billboards
FROM campaign
LEFT JOIN ad_group
ON campaign.campaign_id = ad_group.campaign_id
LEFT JOIN billboard_group
ON campaign.campaign_id = billboard_group.campaign_id
LEFT JOIN used_ad
ON ad_group.group_id = used_ad.group_id
AND used_ad.campaign_id = campaign.campaign_id
LEFT JOIN used_billboard
ON billboard_group.group_id = used_billboard.group_id
AND used_billboard.campaign_id = campaign.campaign_id
GROUP BY campaign.campaign_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.