Alternativprodukt in Onlineshop empfehlen

Nuggme

Benutzer
Beiträge
7
Liebes Forum,

nach der genialen Hilfe lege ich gleich noch ein zweites Problem nach:

Ich habe eine Tabelle die folgendermaßen aussieht:

Kunden_ID: Produkt_ID:
Müller Prod1
Bauer Prod2
Huber Prod5
Müller Prod5
Bauer Prod2
Huber Prod1

Das heißt, sowohl die Kunden als auch die Artikel können öfters vorkommen, je nachdem wie oft jemand was bestellt! Nun möchte ich gerne Kunden, die zB Prod1 kaufen, ein anderes Produkt empfehlen das andere Kunden, die auch Prod1 kaufen, gekauft haben!

Um zu wissen welches Produkt ich empfehle, hätte ich gerne eine Tabelle die so aussieht:

Produkt: Alternativprodukt mit den meisten Kunden:
Prod1 Prod5
Prod2 -----
Prod5 Prod1

Bisher ist mir nur eingefallen erst einmal alle Artikel zu suchen bei denen es kein Alternativprodukt gibt (über alle Kunden, die nur 1 bestimmtes Produkt kaufen und kein anderes):

select count(distinct(Produkt_ID)) as anz_prod, Kunden_ID


from tabelle1

group by kunden_nr;


Aber bei allen anderen - wie gehe ich da am besten vor? Ich dachte eventuell mit einem ranking, aber wie frage ich das am besten ab?

Hoffe auf einen Geistesblitz!!

Lg Nuggme
 
Werbung:
Code:
SELECT Produkt_ID
FROM tabelle
WHERE Produkt_ID != <aktuelles_Produkt>
AND Kunden_ID IN (
SELECT Kunden_ID
FROM tabelle
WHERE Produkt_ID = <aktuelles_Produkt> )
GROUP BY Produkt_ID
ORDER BY count(*) DESC
Man kann das natürlich für alle Produkte in einer Tabelle berechnen aber das ist ja in der Regel gar nicht nötig da du immer den Bezug zu dem grade gezeigten Produkt hast. Es ist also eher eine Frage ob du das im EInzelfall neu ermitteln willst oder aus Performance-Gründen vielleicht irgendwo als Tabelle regelmäßig cachen willst.
 
Hallo, danke erst mal für die super Hilfe!
Ich denke am besten wäre es eine Tabelle für alle Artikel zu erstellen die regelmäßig gewartet wird!Einfach weil es auch eine gute Übersicht ist wenn man sich die einmal ausdrucken wollen würde oder so :)

Um das für alle Produkte zu realisieren müsste ich das in einen loop werfen und nach der Reihe die Produktnummern übergeben und überprüfen oder?

Lg Nuggme
 
Also das regelmäßig neu zu berechnen und in einer Tabelle zu speichern kann sinnvoll sein. Das birgt allerdings einige andere Probleme, ich würde es erstmal mit einer Sicht lösen und später, wenn dein Shop wirklich läuft, eventuell ändern.

Schleifen sind nie eine gute Idee, außer unter MySQL braucht man die eigentlich auch nie.
Code:
SELECT   t.Produkt_ID,
     t.AlternativProdukt_ID
FROM   (

SELECT   ROW_NUMBER() OVER (PARTITION BY t1.Produkt_ID ORDER BY count(*) DESC) AS zeile,
     t1.Produkt_ID,
     t2.Produkt_ID AS AlternativProdukt_ID
FROM   tabelle t1
INNER JOIN tabelle t2
ON     t1.Kunden_ID = t2.Kunden_ID
WHERE   t1.Produkt_ID != t2.Produkt_ID
GROUP BY t1.Produkt_ID,t2.Produkt_ID

     ) t
WHERE   t.zeile = 1
 
ok, wow - da waren ein paar Befehle die ich erst nachschlagen musste ^^

Darf ich dazu ein paar Fragen stellen / Bemerkungen machen ob ich es richtig verstanden habe?

--> Partition by gliedert nach Produkt_ID und ordnet diese in absteigender Reihenfolge an
-->der INNER JOIN hier verknüpft die Tabelle mit sich selbst, nimmt dabei nur Einträge bei denen die Kunden_ID übereinstimmt mit der Bedingung dass die Produkt_ID gleich ist
--> count(*) zählt jeweils über eine Zeile
--> t.zeile = 1 ist das hier sozusagen eine Zählvariable? Diesen Teil verstehe ich nicht so ganz..

--> wenn ich nun auch gerne wissen möchte wie viele Kunden denn genau auf das Alternativprodukt ausweichen würde ich die Abfrage dann so ergänzen?:

SELECT t.Produkt_ID,
t.AlternativProdukt_ID, t.Anzahl_Kunden,
FROM (

SELECT ROW_NUMBER() OVER (PARTITION BY t1.Produkt_ID ORDER BY count(*) DESC) AS zeile,
t1.Produkt_ID,
t2.Produkt_ID AS AlternativProdukt_ID,
count(distinct(t2.Kunden_ID)) as Anzahl_Kunden
FROM tabelle t1
INNER JOIN tabelle t2
ON t1.Kunden_ID = t2.Kunden_ID
WHERE t1.Produkt_ID != t2.Produkt_ID
GROUP BY t1.Produkt_ID,t2.Produkt_ID

) t
WHERE t.zeile = 1

Tausend Dank für die Unterstützung!

Lg Nuggme
 
PARTITION BY fängt bei jeder Produkt_ID neu an zu zählen, ORDER BY sortiert innerhalb der Produkt_ID nach der Spalte, in diesem Fall count(*) absteigend. Die Zeile "zeile" ist also nur die Reihenfolge.

Im äußeren SELECT wird dann auf "zeile" = 1 gefiltert, also zu jeder Produkt_ID hast du nur eine Zeile mit einem Maximalwert da er ja mit dem höchsten angefangen hat zu sortieren. (Theoretisch kann es mehrere Maximalwerte geben, dann würde man vielleicht nicht nur nach count(*) DESC sondern auch noch nach Preis DESC sortieren, teurer ist schließlich besser für den Shop :) ).

Die Anzahl der Kunden sieht richtig aus, ausprobieren kostet nichts.
 
Werbung:
Zurück
Oben