Avatar billede jhni Nybegynder
28. juni 2007 - 18:03 Der er 7 kommentarer

Vis relateret indhold

Hej

Jeg vil gerne bygge en simpel recommendation engine i php + mysql. Når en bruger ser en artikel på mit site, skal brugeren anbefales de 5 andre artikler, som flest brugere der har set den aktuelle artikel også har set.

Jeg har allerede en mysql tabel der indeholder <brugerid> og <artikel id>. Tabellen bliver opdateret hver gang en bruger ser en ny artikel.

Min udfordring består derfor I at få bygget noget SQL/PHP der kan: 1) finde brugere der har set den aktuelle artikel, og 2) finde de 5 mest viste artikler
Avatar billede cronick Nybegynder
28. juni 2007 - 18:48 #1
Da jeg ikke ved hvad tabellerne hedder, eller hvilke celler den tabel, som artiklerne ligger i, indeholder, kan jeg ikke umiddelbart komme med et præcist svar. Men det kunne jo se ud af dette:

$hent_anbefalinger = mysql_query("SELECT tab1.*, tab2.*, count(tab2.id) AS Hyppighed FROM tabel 1 AS tab1 LEFT JOIN tabel 2 AS tab2 ON tab1.brugerid = tab2.brugerid GROUP BY id ORDER BY Hyppighed LIMIT 5")or die(mysql_error());

(Hvor tabel 1 er den med artiklerne, og tabel 2 den hvor besøg bliver registreret)

For et yderligere præciserende svar - evt. komplet præcist, kan du jo komme med dine tabel-dumps (tabelstrukture).. :)
Avatar billede jhni Nybegynder
28. juni 2007 - 20:31 #2
Det ser umiddelbart lovende ud:

Tabellen med artikler (video) indeholder bl.a. feltet:
id - unik id for hver artikel

Tabellen med bruger data (video_rel) indeholder felterne:
vid - unik id for hver artikel
user - brugerid

Håber det giver mening :-)
Avatar billede cronick Nybegynder
28. juni 2007 - 20:39 #3
Okey, så kan du prøve med:

$hent_relateret = mysql_query("SELECT ar.*, bd.*, count(ar.id) AS Hyppighed FROM video AS ar LEFT JOIN video_rel AS bd ON ar.id = bd.vid GROUP BY id ORDER BY Hyppighed LIMIT 5")or die(mysql_error());

Læg mærke til, at jeg har kaldt de to tabeller henholdsvist for "ar" og "bd", for at give dem en forkortelse på to bogstaver, som passer til deres betydning: ar -> artikler og bd > bruger data :)
Avatar billede jhni Nybegynder
28. juni 2007 - 20:52 #4
Har prøvet med nedenstående, men dette giver blot de 5 ældste artikler.

$hent_relateret = mysql_query("SELECT video.*, video_rel.*, count(video.id) AS Hyppighed FROM video AS video LEFT JOIN video_rel AS video_rel ON video.id = video_rel.vid GROUP BY id ORDER BY Hyppighed LIMIT 5")or die(mysql_error());

Mangler der ikke at blive indsat artikel id for den artikel hvor der skal findes relateret indhold i forhold til?
Avatar billede cronick Nybegynder
28. juni 2007 - 22:12 #5
Det skulle der da gerne være indsat i den - såfremt cellen "vid" er dette id. Prøv med:

$hent_relateret = mysql_query("SELECT video.*, video_rel.*, count(video_rel.id) AS Hyppighed FROM video AS video LEFT JOIN video_rel AS video_rel ON video.id = video_rel.vid GROUP BY id ORDER BY Hyppighed DESC LIMIT 5")or die(mysql_error());
Avatar billede jhni Nybegynder
02. juli 2007 - 16:01 #6
Hej igen - var lige væk i weekenden...

Skal lige være sikker på hvor artikel id'et skal indsættes. Hvis jeg eksempelvis har en artikel med id 194, hvor skal dette så indsættes?
Avatar billede cronick Nybegynder
03. juli 2007 - 00:49 #7
Det havde jeg vist lige glemt. Dette bliver nok en noget kringlet kodestring, og det kan sikkert også gøres bedre - hvis en "ekspert" lige falder over denne tråd, og har en bedre løsning, er du velkommen til at give den :)

$hent_relateret = mysql_query("SELECT video.*, video_rel.*, count(video_rel.id) AS Hyppighed FROM video AS video LEFT JOIN video_rel AS video_rel ON video.id = video_rel.vid LEFT JOIN video_rel AS rel ON video_rel.vid = '194' AND video_rel.user = rel.user WHERE rel.user IS NOT NULL GROUP BY id ORDER BY Hyppighed DESC LIMIT 5")or die(mysql_error());

- Puhaa.. Ikke det fjerneste sikker på det virker, da man skal joine den samme tabel 2 gange, men det er vel et forsøg værd.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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