Daha önceki mesajlarda yazıldığı üzre öncelikle product tablosu ile category tablosunu ilişkilendirmek için üçüncü bir tabloya ihtiyaç var. Buna product_category diyelim.
Aşağıdaki resimde örnek olarak tabloyu bir kaç girişle doldurdum.
Resimden de görüleceği üzere bir ürün birden fazla kategoriye eklenmiş durumda. product_category tablosu inner join ile product tablosuna bağlanacak.
SELECT product_category.product_id from (
(select * from product_category where product_category.category_id=5 or product_category.category_id=6
union
select * from product_category where product_category.category_id=83 or product_category.category_id=84)
) AS product_category
inner join product on product.product_id=product_category.product_id
where product_category.product_id in(select product_category.product_id from product_category where product_category.category_id=4)
GROUP BY product_category.product_id HAVING count(*) >= 2;
Sorgu Açıklaması:
Öncelikle or içeren iki sorguyu union ile birleştiriyoruz.
Elde ettiğimiz sonucu inner join ile product tablosuna bağlıyoruz.
Daha sonra tekli sorguyu da ilave ediyoruz.
Sonunda da birden fazla sonuç dönmemesi için grupluyoruz.
Bu istenileni karşılıyor . 1 ve 5 id li ürünleri döndürüyor. Fakat sorgu ne kadar efektif ve performans gösterir mi bilemiyorum. Belki farklı bir mantıkla daha iyi olur. Onu da ustalara bırakalım
Hocam teşekkürler, içiçe sorguları pek kullanmıyorum dolayısıyla bi bakışta mantığı anlamadım, ben de store_product_extend_cat adlı bi kesişim tablosuyla aşağıdaki şekilde sonuca ulaştım (sanırım) bikaç saniye önce ama filtreye elkencek kategori_id'si adedince inner join eklemem gerekiyor sanırım filtreleme sayısına kısıtlama getirmem gerekçek.
SELECT c1.* FROM store_product_extend_cat as c1
INNER JOIN store_product_extend_cat AS c2
ON c1.product_id=c2.product_id
INNER JOIN store_product_extend_cat AS c3
ON c1.product_id=c3.product_id
WHERE (c1.cat_id=75 AND c2.cat_id=76) OR (c3.cat_id=73 )
GROUP BY c1.product_id
Sizinkini de inceleyip araştırıyorum hocam performans için neler diyolar bakalım. Daha iyi bi çözüm önerisi gelmezse ikisi arasında bi seçim yapçam ilginiz için çok çok teşekkürler. R10+
Muhtemelen performans açısından sizin sorgunuz daha başarılı. Borçlandım hocam sana gün gelir ben de yardım edebilirim umarım. İyi çalışmalar.