我试图运行查询以查找我应该宣传哪些广告资源以及我应该投放哪个广告系列,以便我可以移动该广告资源。
我有三张桌子:
campaigns
列出了我可以投放的不同广告系列,每个广告系列都有唯一的ID。有些广告系列只宣传一个项目,有些广告系列宣传多个项目。inventory
包含我库存的所有商品以及这些商品的数量。campaign_to_inventory
将唯一广告系列ID与广告资源项匹配。 campaigns
:
name | id
-------------|---
blue-widgets | 1
gluten-free | 2
gadget | 3
inventory
:
item | qty
-------|----
thing1 | 0
thing2 | 325
thing3 | 452
thing5 | 123
thing7 | 5
campaign_to_inventory
:
id | item
---|-------
1 | thing1
1 | thing2
1 | thing5
2 | thing1
2 | thing3
3 | thing7
我想运行一个查询来查找我可以运行的所有广告系列,其中包含库存所需的广告资源。我目前正在运行此查询:
SELECT * FROM `campaigns` LEFT JOIN `campaign_to_inventory` ON `campaigns`.`id` = `campaign_to_inventory`.`id` LEFT JOIN `inventory` ON `campaign_to_inventory`.`item` = `inventory`.`item`
返回:
name | id | item | qty
-------------|----|--------|----
blue-widgets | 1 | thing1 | 0
blue-widgets | 1 | thing2 | 325
blue-widgets | 1 | thing5 | 123
gluten-free | 2 | thing1 | 0
gluten-free | 2 | thing3 | 452
gadget | 3 | thing7 | 5
我应该使用PHP来处理这些数据,只查找所有项目数量都大于最小阈值的广告系列,还是有办法修改查询以限制那里的行?有什么时候我可以/应该在一个而不是另一个中做到这一点的经验法则吗?
答案 0 :(得分:1)
无需在PHP中处理数据。
执行此操作的一种方法是选择项目数小于阈值的campaign_to_inventory.id
列,如下所示:
SET @min_qty = 1;
SELECT `c_to_i`.`id` FROM `campaign_to_inventory` AS `c_to_i`
INNER JOIN `inventory` ON `inventory`.`item` = `c_to_i`.`item`
WHERE `inventory`.`qty` <= @min_qty;
...然后从campaign_to_inventory
执行左外连接到这样:
SET @min_qty = 1;
SELECT `id`, `name` FROM `campaigns`
LEFT JOIN (
/* Table of campaigns which contain items with not enough qty*/
SELECT `c_to_i`.`id` FROM `campaign_to_inventory` AS `c_to_i`
INNER JOIN `inventory` ON `inventory`.`item` = `c_to_i`.`item`
WHERE `inventory`.`qty` <= @min_qty
) AS `campaigns_with_not_enough_items`
ON `campaigns`.`id` = `campaigns_with_not_enough_items`.`id`
WHERE `campaigns_with_not_enough_items`.`id` is NULL;
结果应该是一张包含库存所需库存的广告系列表。
另外,您应该将campaign_to_inventory.id
列重命名为campaign
,因为名称id
表示该列是该表的主键。