MySQL Subqueries / Joins - PullRequest
       7

MySQL Subqueries / Joins

2 голосов
/ 27 сентября 2011

У меня есть две разные таблицы, продукты и инвентарь.

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

Моя цель - узнать, какие продукты имеют количество 0.

Таблица инвентаризации имеет несколько строк для каждого идентификатора продукта. Проблема, с которой я сталкиваюсь, заключается в том, что ALL строк инвентаря, которые соответствуют определенному продукту, должны иметь значение 0, чтобы результат был мне полезен (это то, что я пытаюсь понять вне)

Прямо сейчас я просто зацикливаюсь на каждом продукте, а затем выполняю второй оператор SQL, который проверяет наличие в количестве> 0 в таблице инвентаризации для выбранного продукта, но это не работает с моим сценарием пагинации 20 тыс. Строк в таблице товаров, многие другие в таблице инвентаризации. Отображать все сразу не вариант)

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

псевдокод

Запрос становится.

SELECT p.*, SUM(i.qty,0) as number_in_stock
FROM product p
INNER JOIN inventory i ON (i.product_id = p.id)
GROUP BY p.id
HAVING number_in_stock = 0

Это будет намного медленнее, потому что он работает только после того, как все соединения были выполнены.

Если вы удаляете строку инвентаря из таблицы, когда qty становится 0, вы можете выполнить этот запрос, который выполняется намного быстрее:

SELECT p.*
FROM product p
LEFT JOIN inventory i ON (i.product_id = p.id)
WHERE i.id IS NULL

Левое объединение делает это в обувном магазине

product id name           inventory id prod_id qty
------------------        -------------------
        1  shoe                      1 1       10
        2  horse                     We have no horses, all nulls
        3  boot                      2 3       55
        4  ferrari                   go to the cardealer, all nulls

Теперь все, что нам нужно сделать, это выбрать все строки с null в поле для инвентаря, которое обычно не может быть null.Ага, первичный ключ никогда не может быть нулевым, поэтому, если мы выберем все строки, в которых инвентарь PK is null, у нас будут товары, которых нет в инвентаре.

1 голос
/ 27 сентября 2011

Вы должны просто выполнить внутреннее соединение между двумя таблицами, а затем выбрать, где quantity == 0.

Что-то вроде:

select
    products.*
from
    products
where
    (select sum(inventory.quantity) from inventory where products.id = inventory.productId) = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...