CREATE TEMPORARY VIEW available_campaigns AS -- all subscribed campaigns of the given ad type SELECT campaigns.id FROM campaigns INNER JOIN subscriptions ON subscriptions.campaign_id = campaigns.id AND subscriptions.site_id = v_site_id WHERE campaigns.ad_type = v_ad_type -- exclude banned campaigns EXCEPT SELECT actions.campaign_id FROM actions INNER JOIN campaigns ON campaigns.id = actions.campaign_id AND campaigns.pay_per = v_action AND actions.address = v_address AND now() - actions.created_at < campaigns.reload_ban; SELECT campaigns.id INTO a_campaign_id FROM available_campaigns AS campaigns ORDER BY random() LIMIT 1;