2016-04-04 15 views
0

Öğeleri gruplamak için bir etiketleme sistemi kullanıyorum. Temel olarak bir öğeye belirli etiketler ekliyorum ve daha sonra, etiketlerin bazılarını veya tümünü içeren diğer öğeler için veri tabanını arayarak ve sonuçlara her öğe için maksimum etiket sayısıyla sipariş vererek, ona benzer öğeler bulabilirim. . İşte bazı sahte kod:ile ilgili diğer öğeleri maks. benzer etiketler

product: id, name, description 
    tags: id, name 
    product_tags: id, product_id, tag_id 


    map = new Map<int product_id, int occurances> 
    loop product_tags.where(tag_id: [1,2,3]) as |ptag| 
     map[ptag.product_id]++ 
    end 
    sort map by max occurrences 
    return map.top(6) 

Sorum şu; Bu görevi yürütmek için tek bir mysql sorgusunu nasıl oluşturabilirim? Bunu başarmanın alternatif yöntemlerine de açığım.

+0

Hi ve taşma yığını hoş geldiniz: Eğer ürünler gerekiyorsa

product_ids = ProductTag .joins("INNER JOIN product ON products.id = product_tags.product_id") .where("tag_id IN (?)", [1,2,3]) .select("product_id, count(product_id) as product_count") .group("product_id") .order("product_count DESC") .limit(6) .map(&:product_id) 

Sonra böyle bir şey yapabilirsiniz. Burada önce kendinize gitmenizi ve neler olduğunu görmenizi bekliyoruz. Belkide zaten var. Çeşitli SQL sorgularını denediğinizde ne oldu? Sonuçtan neden memnun değildiniz? Neden zaten bildiğiniz tüm parçaları yaparak işe başlamıyorsunuz ve sonra zor kısımlara gidiniz ... sonra bize takılı olduğunuz parçalarla geri dönün ve bize gösterebilirsiniz. sonuçlar ne elde edeceğiniz ve neyi beklediğiniz ile karşılaştırıyorsunuz :) –

+0

Şu anda bunu nasıl yaptığımı gösteren sahte kod sağladım. Benim yöntemim veritabanında yerine sunucu üzerinde sıralama yaptığı gibi oldukça etkisizdir. – user3642563

+0

Korkarım ki, sahte koddaki gerçek hataları ayıklamak gerçekten zor ... kodunuzun sözlü açıklamasında hata ayıklamaya çalışmak gibi. SQL'i gerçekten denediyseniz, lütfen SQL'i buraya ekleyin (sorunuzu düzenleyin ve yorumlarda biçimlendirme yapmak korkunç olduğu için ekleyin). O zaman sana yardım etmeye başlayabiliriz :) –

cevap

0

Ürün kimliklerini ister misiniz?

böyle bir şey ile gider:

Product.find(product_ids) 
+0

Teşekkürler! Onu test edip sana döneceğim. – user3642563

+0

Çalışıyor görünüyor, çok teşekkürler! – user3642563

İlgili konular