Sven Rautenberg: (PHP/ MySQL) - kunden die X kauften kauften auch y......

Beitrag lesen

Moin!

Ich glaube da war eher jemand zu faul, sein Crossposting in ein englischsprachiges Forum zu übersetzen ;-).

Hopefully he doesn't forget his posting here. :)

Wenn ich allerdings mal auf meine vergangenen Einkaufszettel schaue, dann ist eine Kombination beliebiger Produkte kaum sinnvoll: Wer Karotten kauft, kauft auch Senf (damit er was zum Würzen hat?). Wer Senf kauft, kauft auch T-Shirts (weil er sich vollkleckert und keinen Bock zum Waschen hat?). Wer T-Shirts kauft, kauft auch Toilettenpapier (Ähm...???).

Deswegen ja auch "Customer who bought..." usw., Dein Datenbankschema würde ja nur die gleichzeitigen Bestellungen erfassen, bei sowas wie z.B. Amazon wird aber in der Datenbank erfaßt, was die Kunden, die diesen Artikel bestellt haben, irgendwann einmal gekauft haben. Das geht nur so wie es srob gesagt hat ("nur" natürlich in Anführungszeichen, es gehen sicher auch noch andere Datenbankschemen, aber man braucht die Kunden->Artikel Verknüpfung).

Das Datenbankschema von srob ist grausam! Das muß anders gehen.

Und btw: Ich hab nur schöner umgesetzt, was srob angedacht hat. Wenn er alle Käufe eines Kunden, die jemals getätigt wurden verknüpfen und auswerten will, wird es extrem viel komplizierter. Und auch nicht mehr einfach abfragbar.

Wenn man einen Artikel ansieht, dann muß man, um die gewünschte Info zu kriegen, erstmal alle Kunden abfragen, die den Artikel bestellt haben, dann alle Artikel, die diese Kunden ebenfalls schon bestellt haben, und das dann sinnvoll zusammenfassen. Wenn hundert Kunden den ersten Artikel bestellt haben, und jeder Kunde insgesamt schon 20 Artikel, dann entstehen 2000 Artikel, die man auswerten muß - ist natürlich noch kein wirklicher Aufwand, Amazon wird so aber nicht arbeiten können. Wenn man mehr als 100 Kunden hat, und mehr als 20 Artikel, dann wird das IMO langsam ziemlich performance-aufwendig. Besser ist, regelmäßig mal ein Skript durch die Datenbank zu jagen, um diese Verknüpfungen zu generieren, die dann relativ einfach abgefragt werden können.

Und dann funktioniert das statistisch wunderbar, wenn man genügend Datensätze hat, um Zufälligkeiten unter ein bestimmtes Niveau zu drücken. Die Empfehlungen, die man bei Amazon bekommst, sind sehr selten unpassend, ich nehme an, die zeigen das "Kunden, die dieses Buch gekauft haben, haben auch diese Bücher gekauft" nur an, wenn ein bestimmter Schwellenwert an Korrelation überschritten ist.
Also a la:
"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";

Naja, wenigstens legst du pro Kauf keine gesonderte Tabelle an. ;)

- Sven Rautenberg