簡體   English   中英

mySQL查詢連接五個表

[英]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_adused_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM