简体   繁体   English

mySQL查询连接五个表

[英]mySQL query joining five tables

I have the following five tables (some fields omitted for brevity) 我有以下五个表(为简洁起见省略了一些字段)

(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
==============

So a "campaign" is made up of 1) an "ad_group", and 2) a "billboard_group". 因此,“广告系列”由1)“ad_group”和2)“billboard_group”组成。 The ad_group contains many ads (stored in the "used_ad" group), and the billboard_group contains many billboards (stored in the "used_billboard" group). ad_group包含许多广告(存储在“used_ad”组中),而billboard_group包含许多广告牌(存储在“used_billboard”组中)。

I want to run a query that will return all of the campaigns, and list the total number of ads and billboards that are related to that campaign. 我想运行一个返回所有广告系列的查询,并列出与该广告系列相关的广告和广告牌总数。 I've been able to do this for ad_group only, but not ad_group AND billboard_group. 我只能为ad_group执行此操作,但不能执行ad_group AND billboard_group。

For example, this query: 例如,这个查询:

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

Gives a listing like this: 给出这样的列表:

campaign_id     campaign_name     campaign_description    used_ads
1               Test campaign     Testing                 4
2               Second campaign   Second                  0

But what I'm after is: 但我所追求的是:

campaign_id     campaign_name     campaign_description    used_ads    used_billboards
1               Test campaign     Testing                 4           5
2               Second campaign   Second                  0           3

Only I can't seem to figure out how to include counts from BOTH used_ad and used_billboard. 只有我似乎无法弄清楚如何从BOTH used_ad和used_billboard中包含计数。 I'd be grateful for any help. 我会感激任何帮助。

To avoid Cartesian multiplications, I'd group and count used_ad and used_billboard separately and only then join them: 为了避免笛卡尔乘法,我将分别对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

Something like this might work if billboard_code is unique: 如果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