2016-04-04 6 views
0

Ich verwende ein Tagging-System, um Elemente zu gruppieren. Grundsätzlich füge ich einem Element bestimmte Tags hinzu und kann dann ähnliche Elemente suchen, indem ich die Datenbank nach anderen Elementen durchsuche, die einige oder alle Tags enthalten, und dann die Ergebnisse nach der maximalen Anzahl von Tags für jedes Element sortieren . Hier ist ein Pseudo-Code:Ähnliche Artikel finden Sie, indem Sie nach Artikeln mit max. von ähnlichen Tags

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) 

Meine Frage ist; Wie erstelle ich eine einzelne MySQL-Abfrage, um diese Aufgabe auszuführen? Ich bin auch offen für alternative Methoden, dies zu erreichen.

+0

Hallo und willkommen Überlauf zu stapeln. Hier erwarten wir, dass Sie zuerst selbst darauf gehen und sehen, was passiert. Vielleicht hast du es schon. Was ist passiert, als Sie verschiedene SQL-Abfragen ausprobiert haben? Warum waren Sie mit dem Ergebnis nicht zufrieden? Warum beginnst du nicht damit, all die Teile zu machen, die du bereits kennst, und dann in den schwierigen Teilen ... dann komm zurück zu uns mit den Teilen, an denen du feststeckst, und du kannst es uns zeigen was die Ergebnisse sind, die Sie bekommen und vergleichen Sie mit, was Sie stattdessen erwarten :) –

+0

Ich habe Pseudocode zur Verfügung gestellt, der zeigt, wie ich es gerade jetzt mache. Meine Methode ist jedoch ziemlich ineffizient, da die Sortierung auf dem Server statt in der Datenbank erfolgt. – user3642563

+0

Ich fürchte, es ist wirklich schwer, echte Fehler im Pseudocode zu debuggen ... es ist wie der Versuch, eine verbale Beschreibung Ihres Codes zu debuggen. Wenn Sie SQL tatsächlich ausprobiert haben, fügen Sie bitte das SQL hier ein (bearbeiten Sie Ihre Frage und fügen Sie sie hinzu, weil die Formatierung in Kommentaren schrecklich ist). Dann können wir anfangen, dir zu helfen :) –

Antwort

0

Möchten Sie die Produkt-IDs?

würde ich mit so etwas wie dies gehen:

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) 

Dann Sie etwas tun können, wenn Sie die Produkte benötigen:

Product.find(product_ids) 
+0

Danke! Ich werde es testen und zu dir zurückkommen. – user3642563

+0

Scheint zu funktionieren, vielen Dank! – user3642563

Verwandte Themen