псевдокод
Запрос становится.
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
, у нас будут товары, которых нет в инвентаре.