【问题标题】:Modify MySQL Query or Run in PHP修改 MySQL 查询或在 PHP 中运行
【发布时间】:2018-05-21 01:24:31
【问题描述】:

我正在尝试运行查询以查找我应该推广哪些广告资源以及应该运行哪个广告系列,以便我可以移动该广告资源。

我有三张桌子:

  • 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 处理这些数据以仅查找所有商品数量都大于最小阈值的广告系列,还是有办法修改查询以限制那里的行数?是否有一个经验法则来说明我什么时候可以/应该做一个而不是另一个?

【问题讨论】:

  • 它可能适用于 SQL。最小值在哪里定义?

标签: mysql


【解决方案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 意味着该列是表的主键。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2012-02-22
    • 2012-01-04
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多