Логика c в подзапросах довольно болезненная для подражания, поэтому я не уверен, что у меня она на 100% правильная. Например, пример данных, кажется, имеет только одну строку на продукт, но я не знаю, так ли это на самом деле. Или что такое opt_id
, потому что это может показаться полезным в запросе, использующем таблицу pov
.
При этом кажется, что вам просто нужны JOIN
и GROUP BY
, чтобы получить то, что Вы хотите - запрос, который намного проще и должен быть быстрее в любой базе данных.
В следующем запросе я также разделил двух поставщиков на разные строки. Это, по крайней мере, полезно для получения правильной логики c:
SELECT vendor_id,
COUNT(DISTINCT p.p_id) AS num_products,
SUM(CASE WHEN p.quantity <> pov.quantity AND pov.quantity = 0 THEN 1 ELSE 0 END) as partial_soldout,
COUNT(DISTINCT CASE WHEN p.quantity = 0 THEN p.p_id END) as soldout
FROM product p LEFT JOIN
product_option_value pov
ON pov.p_id = p.p_pid
WHERE p.vendor_id IN (5, 6) AND p.status = 1
GROUP BY p.vendor_id;