我有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
答案 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()