I have 3 tables:
products (id, category, …),
store_offers (product_id, offer_id, platform) – joining the products table with many tables with offers, e.g. ebay, amazon, etc.
ebay_offers (id, status, country, …).
I need to get the id of products (in addition with a specific category_id) that have no listings on ebay (ie not available in the ebay_offers table with the value “uk” for the country column).
I tried something like this unfortunately it doesn’t show me the correct values:
SELECT products.id
FROM products
LEFT JOIN store_offers ON store_offers.product_id = products.id
LEFT JOIN ebay_offers ON ebay_offers.id = store_offers.offer_id
where products.category_id = 43567 AND store_offers.platform = 'ebay' AND ebay_offers.country = "uk" IS NULL
;
I can guess why the query does not generate results, but in this case I have no idea how to extract the data that interests me.
Advertisement
Answer
I recommend using not exists
:
select p.id
from products p
where not exists (select 1
from store_offers so join
ebay_offers eo
on eo.id = so.offer_id
where so.product_id = p.id and
so.platform = 'ebay' and
eo.country = 'uk'
) and
p.category_id = 43567;
You can do this with left join
. The issue is the country
condition in the where
clause. It requires a match — conflicting with the null
comparison. The syntax for the NULL
comparison is also off. So:
SELECT p.id
FROM products JOIN
store_offers so
ON so.product_id = p.id AND
so.platform = 'ebay' LEFT JOIN
ebay_offers eo
ON eo.id = so.offer_id AND
eo.country = 'uk'
WHERE p.category_id = 43567 AND eo.id IS NULL;