Avatar billede mkjaer Nybegynder
24. marts 2008 - 13:21 Der er 4 kommentarer

webshop: Kunder der har købt dette produkt har også købt

Hejsa,

Jeg forsøger at lave en query, som skal give mig en funktion a la 'Kunder der har købt dette produkt har også købt'. Jeg mente selv, at jeg var skarp nok i JOINS og MYSQL-forespørgelser, men jeg må nok give op - og bede om hjælp her :-)

Funktionen skal vise op til 3 andre produkter, som oftest er købt sammen med det aktuelle produkt.

Jeg har følgende tabeller:

ordre
-------
id
kundenavn
-------

vare
-------
id
varenavn
varepris
-------

ordrevarer
-------
ordreid
vareid
antal
-------

Når en ordre er afgivet, så består den således af en post i 'ordre' og en post pr. varelinie i 'ordrevarer'.

Jeg glæder mig til, at se hvordan 'nødden' kan knækkes :-)
Avatar billede nicklasb Nybegynder
24. marts 2008 - 14:23 #1
Den kan helt sikkert optimeres en del, men mest af alt for at demonstere, at du ikke behøver alle de tabeller du har listet - nedenfor er kun 'ordrevarer' tabellen brugt;

Jeg går ud fra at du vil give et ID for en vare, du vil finde "relaterede" produkter til?

SELECT `vareid` FROM `ordrevarer` WHERE `vareid` != 202 AND `ordreid` IN (SELECT `ordreid` FROM `ordrevarer` WHERE `vareid` = 202) GROUP BY `vareid` ORDER BY count(`ordreid`) DESC LIMIT 0,3

De to steder hvor der står 202 skal du indsætte ID'et.
Avatar billede mkjaer Nybegynder
24. marts 2008 - 14:42 #2
Tjoee, men jeg skal have tilføjet en betingelse: ordre.status skal være '1', så derfor startede jeg selv ud med nogle JOINS.

Nogle med erfaringer med svartider på ovenstående SELECT-i-SELECT'ere i forhold til joins?
Avatar billede nicklasb Nybegynder
24. marts 2008 - 14:54 #3
Det tager langt tid at neste SELECT kommandoer - men den inderste er i tilfældet ovenfor, altid samme resultset, så hvis du kører den en gang og gemmer det i en variabel, du senere kan bruge i den anden, er det kun to SELECT kommandoer der skal udføres. Du kan eventuelt smide det i en MySQL funktion - så skal du ikke "svine" din kode til med ligegyldige kald - og så kan du lade data ligge på MySQL serveren, i stedet for at kaste det frem og tilbage over nettet / applikationerne.

Alternativet er nogle lidt længere JOINS - og JOINS tager også tid .. Men altså - som sagt er det heller ikke kønt som ovenfor, blot at skalere ned på resultatet med LIMIT, den skal stadig hente alt data ud, for at kunne skalere ned.
Avatar billede nicklasb Nybegynder
15. marts 2009 - 19:49 #4
Skal vi lukke spørgsmålet? Eller arbejder du stadig på at få det til at virke?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester