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