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.
Yukarıda ki sorguya dikkat etmemiştim o kadar uzatmanıza gerek yok hocam konu içerisinde ki arkadaşların izlediği yöntem doğru ancak yol uzun.
Product tablosuna bir alan daha açın category_id olsun kategori eşleştirme için ;
Ürün Tablosu :
id | category_id (varchar) | name
1 | 2,1 | Ürün Adı
2 | 1,11 | Genel Kategorisine Eklenen Ürün Adı.
// Tekrar düzenlendi.
// Örnek Sorgu ;
SELECT * FROM products WHERE
FIND_IN_SET( 1 , category_id )
OR FIND_IN_SET( 2 , category_id )
ALTERNATİF ve ESNEK YÖNTEM
İlişkilendirme için relationships adında bir tablo açarsınız örnek yapısını iletiyorum
relationships ;
object_id ( hangi ürün ilişkilendiriliyor ) | action_id ( ilişkilendirilen kategori id ) | type ( tür esnek kullanım için eklenebilir )
1 | 1 | category
2 | 2 | category
Örnek Sorgu ;
SELECT * FROM products WHERE id IN ( SELECT object_id FROM relationships WHERE action_id IN( 1 , 2 , 3, 4 ) AND type = 'category' )
//
// Alternatif
SELECT
products.*
FROM
products
LEFT JOIN
relationships
ON
relationships.object_id= products.id
WHERE
relationships.action_id IN ( 1, 2 )
AND
relationships.type = 'category'
// Alternatif
SELECT * FROM products WHERE id IN
(
SELECT
object_id
FROM
relationships
WHERE
action_id IN(1,2)
veya
action_id = 2
)
Bir kaç açıklama ekleyeyim ;
relationships tablosunda ki type alanını neden ekledim ?
Varsayalım bir galeri modülünüz var ve bunda da kategorilerinizi eşleştirmek ve kullanmak istiyorsunuz.
type alanı olduğu için tür belirterek galeri kategori eşleştirmesini tamamlayabilirsiniz eğer type alanı olmasaydı object_id'ye eklenen ürün id ile galeri'nin id'sinin çakışma olasılığı mevcuttu " AND type = 'gallery' " veya " AND type = 'category' " diyerek bundan kaçınabiliyoruz ve böylelikle sizde birden fazla tablo açmamış oluyorsunuz tek tablo üzerinden tüm eşleşmelerinizi yapabiliyorsunuz.
Performans olayına gelirsek :
IN içerisinde (SUBQUERY) select attığım için 2 sorgu sormakta
Gözle görülür bir fark yaşamazsınız ancak join subquery'den daha hızlı çalışır.
Tavsiyem ise ilk söylediğim yöntemi kullanmanız ( FIND_IN_SET ).