Stephan Huber: (PHP/ MySQL) - kunden die X kauften kauften auch y......

Beitrag lesen

Hallo Andreas,

Aber das Problem ist und bleuibt: Du mußt zuerst alle Kunden Filtern, die dieses Artikels X bereits gekauft haben, und dann weiß ich auch nichtz so recht was man am besten macht. Ich würde es probieren, die ganzen Kundennummern in die Where-Bedingung zu schreiben, dann könnte man nämlich direkt in der Abfrage die Zahlen der Artikel Y  ermitteln. Sonst braucht man ne Schleife, udn muß mit Variablen mitzählen.

Warum so kompliziert? Mit dem select, den ich oben angegeben hatte ("select count(*) as anzahl from kunden_artikel as ka left join kunden_artikel as ka2 on ka.kundenid=ka2.kundenid where ka.artikelid=$gekaufter_artikel and ka2.artikelid!=$gekaufter_artikel group by ka2.artikelid having anzahl>5 order by anzahl desc"), kriegt man doch alles, was man braucht, wenn die kundenid auch bei den Bestelldetails mit gespeichert wird. Das Filtern der Kunden macht der Join der Bestelldetails-Tabelle mit sich selbst, weil auf der linken Seite nur die kundenids der Kunden übrigbleiben, die Artikel X gekauft haben.

Die sauberste Lösung wäre wohl ein Subselect, aber das kann ich nicht, und MySQL (noch) ebensoweinig. Naja, egal was man macht, wenn das viele Kunden sind, wird das ganze recht lahm, befürchte ich!

Bei 10.000 bestellten Artikeln im Monat sind das nach zwei Jahren 240.000 Datensätze in der Tabelle, die mit sich selbst gejoined wird, auf einem vernünftigen Server mit genügend RAM ist das kein Problem, sind ja alles int-Spalten, und man kriegt einen sehr viel kleineren Wert für die gejointen Datensätze als das volle Kreuzprodukt, ungefähr "absolute Verkaufszahl für Artikel X" * "Artikel pro Kunde", die Zeit für den Query sollte also linear mit der Anzahl der Bestellungen wachsen, nicht exponentiell, wie Du wohl befürchtest.

Und falls es wirklich irgendwann zu langsam wird, ist es doch kein Problem, für jeden Artikel eine Cache-Datei anzulegen, in der die "verwandten Artikel" gespeichert werden. Beim Aufruf der Artikelseite wird nachgeschaut, ob die Cachedatei älter als 24h ist, wenn nicht, wird die zum User geschickt, sonst wird der query ausgeführt und die Datei neu geschrieben.

Viele Grüße
Stephan