MySQL Subselect将两个表和聚合函数问题分解为单个查询

时间:2016-03-29 19:48:18

标签: mysql sql subquery

我有2张桌子

交易表

    +----+----------+-----+---------+----
    | TID | CampaignID    | DATE        | 
    +----+----------+-----+---------+---+
    |  1 |              5 | 2016-01-01  |  
    |  2 |              5 | 2016-01-01  |
    |  3 |              2 | 2016-01-01  |  
    |  4 |              5 | 2016-01-01  |  
    |  5 |              1 | 2016-01-01  | 
    |  6 |              1 | 2016-02-02  |
    |  7 |              3 | 2016-02-02  | 
    |  8 |              3 | 2016-02-02  |
    |  9 |              5 | 2016-02-02  | 
    |  10|              4 | 2016-02-02  | 
    +----+----------+-----+---------+---+

广告系列表

    +-------------+----------------+--------------------
    | CampaignID | DailyMaxImpressions  | CampaignActive 
    +-------------+----------------+--------------------
    |           1 |              5 |                Y  |  
    |           2 |              5 |                Y  |
    |           3 |              5 |                Y  |  
    |           4 |              5 |                Y  |  
    |           5 |              1 |                Y  | 
    +-------------+----------------+--------------------

我要做的是获得一个随机广告系列,其中交易表中的计数小于广告系列表中的每日最大展示次数。我也可能在事务表的查询中传递日期的一部分

因此,对于CampaignId 1,交易表中必须有4个较小的trans,而Campaignactive必须是“Y”

如果可以在一个声明中完成,那么将不胜感激。 (mysql)

提前致谢,

Jeff Godstein

1 个答案:

答案 0 :(得分:0)

这应该适合你。基本查询是选择每个活动的广告系列。 INNER查询将针对相关日期针对每个广告系列进行预聚合。由此,LEFT-JOIN允许返回任何广告系列,即使它在子查询中不存在或者它存在,但计数小于相关日期允许的计数。 RAND()的顺序很明显。

SELECT
      c.CampaignID
   from
      Campaign c
         LEFT JOIN 
         ( select 
                 t1.CampaignID,
                 count(*) as CampCount
              from
                 Transaction t1
              where
                 t1.Date = YourDateParameterValue 
              group by
                 t1.CampaignID ) as T
            ON c.CampaignID = T.CampaignID 
   where
          c.CampaignActive = 'Y'
      AND ( t.CampaignID IS NULL
         OR t.CampCount < c.DailyMaxImpressions )
   order by
      RAND()