首页 > 解决方案 > 连接后 SQL 内连接返回错误值

问题描述

我有两个名为adsand的表videos。类似的尺寸date,ad_id,ad_name,campaign_name在两个表中都很常见。但是,ads 表有spend和表有。当我按此表中的每一个进行分组时,我正在汇总的指标的值似乎很好。但是一旦我加入他们,返回输出就不正确例如,如果我加入他们时第 1 天的总支出用于特定的 ad_id,我将其视为.impressionsvideosvideoviews100400

SELECT
  a.date adsdate,   a.campaign_name campaign_name,
  a.ad_group_name ad_group_name,
  a.ad_name ad_name,
  a.ad_id ad_id,
  SUM(a.cost) fb_cost,
  SUM(a.impressions) fb_impressions,
  SUM(b.action_video_view) fb_videoview
FROM
  fb_ads a  inner join
  `fb_videos b ON
   CONCAT(a.date,'_',a.ad_id)=
   CONCAT(b.date,'_',b.ad_id)
GROUP BY
  adsdate,
  campaign_name,
  ad_group_name,
  ad_name,
  ad_id
  HAVING
  ad_id = ‘1234567’
order by 
adsdate asc

标签: mysqljoininner-join

解决方案


检查这个:

SELECT adsdate,
       a.campaign_name,
       a.ad_group_name,
       a.ad_name,
       '1234567' ad_id,
       a.fb_cost,
       a.fb_impressions,
       b.fb_videoview
FROM ( SELECT `date` adsdate,
              campaign_name,
              ad_group_name,
              ad_name,
              SUM(cost) fb_cost,
              SUM(impressions) fb_impressions
       FROM fb_ads
       WHERE ad_id = '1234567'
       GROUP BY 1,2,3,4 ) a
JOIN ( SELECT `date` adsdate,
              SUM(action_video_view) fb_videoview
       FROM fb_videos
       WHERE ad_id = '1234567'
       GROUP BY 1 ) b USING (adsdate)

我将如何通过使用 concat – sten 加入来做到这一点

您使用唯一的ad_id值 (ad_id = '1234567') - 所以加入它没有任何意义,加入adsdate就足够了。

但是,如果您想通过 2 列加入,那么您不需要串联。使用以下任何加入条件:

.. ON t1.ad_id = t2.ad_id AND t1.adsdate = t2.adsdate ..
.. ON (t1.ad_id, t1.adsdate) = (t2.ad_id, t2.adsdate) .. 
.. USING (ad_id, adsdate) .. 

所有这些形式都是您表达的绝对等价物,CONCAT但更加快速和清晰。


推荐阅读