Изменить MySQL Query или запустить в PHP

0

Я пытаюсь запустить запрос, чтобы найти, какой инвентарь я должен рекламировать, и какую кампанию я должен выполнить, чтобы я мог перемещать этот инвентарь.

У меня три таблицы:

  • campaigns перечислены различные кампании, которые я могу запустить, каждая кампания имеет уникальный идентификатор. Некоторые кампании рекламируют только один элемент, а некоторые рекламируют несколько элементов.
  • inventory имеет все предметы, которые у меня есть на складе, и количество этих предметов.
  • campaign_to_inventory сопоставляет уникальный идентификатор кампании с элементом инвентаря.

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
    Скорее всего, это работает в SQL. Где определены минимумы?
Теги:

1 ответ

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 имени подразумевает, что столбец является основным ключом для таблицы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню