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
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).. :)
$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 :)
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?
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());
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.
Synes godt om
Ny brugerNybegynder
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.