Avatar billede latrell Nybegynder
30. november 2006 - 15:57 Der er 15 kommentarer og
1 løsning

Hive berømte artikler ud af systemet

Hej Eksperter :-)

Jeg er i gang med at lave et artikel hvor brugere kan bedømme artiklen fra 1-5, hvor 5 er det bedste.

Det er så meningen jeg vil have publiceret de 2 bedste artikler skrevet indenfor de sidste 14 dage, ud fra bedømmelserne.

Problemet ligger i at mine artikler og mine artikel kommentarer ligger i hver sin database tabel.

Hvordan kan jeg få den til at regne ud hvilke artikler der har fået bedst bedømmelse, og derefter hive dem ud af den anden databasetabel?

Jeg bruger pt. denne til at hive artiklerne ud, baseret på antal læste gange:
------

"SELECT * FROM artikler WHERE DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= tid ORDER by laest DESC";
Avatar billede dennismp Nybegynder
30. november 2006 - 17:12 #1
Hvordan gemmer du bedømmelserne?
Avatar billede coderdk Praktikant
30. november 2006 - 17:32 #2
Altså hvis du har en artikeltabel og en bedoemmelsestabel og de er koblet sammen af artikel_id så noget i stil med:

SELECT a.*, AVG(b.karakter) AS gennemsnit FROM artikler AS a INNER JOIN bedoemmelser AS b ON a.id = b.artikel_id GROUP BY b.karakter ORDER BY gennemsnit DESC LIMIT 2
Avatar billede coderdk Praktikant
30. november 2006 - 17:34 #3
Sludder

SELECT a.*, AVG(b.karakter) AS gennemsnit FROM artikler AS a INNER JOIN bedoemmelser AS b ON a.id = b.artikel_id GROUP BY b.artikel_id ORDER BY gennemsnit DESC LIMIT 2

Er i øvrigt pludselig i tvivl om man kan order by på den :D
Avatar billede coderdk Praktikant
30. november 2006 - 17:35 #4
(Det burde virke - heheheh)
Avatar billede latrell Nybegynder
30. november 2006 - 18:11 #5
Sådan ser artikel strukturen ud:

CREATE TABLE `artikler` (
  `id` int(10) NOT NULL auto_increment,
  `overskrift` varchar(255) character set latin1 NOT NULL default '',
  `tekst` longtext character set latin1 NOT NULL,
  `forfatter` int(10) NOT NULL default '0',
  `tid` datetime NOT NULL default '0000-00-00 00:00:00',
  `godkendt` varchar(255) character set latin1 NOT NULL default '',
  `ip` varchar(255) character set latin1 NOT NULL default '',
  `billede` varchar(255) character set latin1 NOT NULL default '',
  `laest` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=8 ;

Sådan ser artikel kommentar strukturen ud:


CREATE TABLE `artikel_kommentarer` (
  `id` int(10) NOT NULL auto_increment,
  `idid` int(10) NOT NULL default '0',
  `forfatter` int(10) NOT NULL default '0',
  `vurdering` int(10) default '0',
  `kommentar` text NOT NULL,
  `ip` varchar(255) NOT NULL default '',
  `tid` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;


Hvor vurdering er vurderingen fra 1-5 og idid er artiklens id
Avatar billede coderdk Praktikant
30. november 2006 - 18:19 #6
Prøv med

SELECT a.*, AVG(b.karakter) AS gennemsnit FROM artikler AS a INNER JOIN artikel_kommentarer AS b ON a.id = b.idid GROUP BY b.idid ORDER BY gennemsnit DESC LIMIT 2
Avatar billede latrell Nybegynder
30. november 2006 - 18:40 #7
Det ser ud til at virke! :-)

Dog måtte jeg lige ændre din b.karakter til b.vurdering ;-)

Men jeg vil jo gerne have at den kun viser artikler der er højst 14 dage gamle. Kan det lade sig gøre? :)
Avatar billede latrell Nybegynder
30. november 2006 - 18:40 #8
.. (og hvis det kan lade sig gøre, så med mindst 3 kommentarer, ellers ligemeget) :)
Avatar billede latrell Nybegynder
30. november 2006 - 18:41 #9
men det ser således ud nu:

SELECT a.*, AVG(b.vurdering) AS gennemsnit FROM artikler AS a INNER JOIN artikel_kommentarer AS b ON a.id = b.idid GROUP BY b.idid ORDER BY gennemsnit DESC
Avatar billede coderdk Praktikant
30. november 2006 - 19:04 #10
Cool :-D

Du ændrer bare LIMIT til 3 i stedet for 2 :)
Avatar billede coderdk Praktikant
30. november 2006 - 19:04 #11
Altså:

SELECT a.*, AVG(b.vurdering) AS gennemsnit FROM artikler AS a INNER JOIN artikel_kommentarer AS b ON a.id = b.idid GROUP BY b.idid ORDER BY gennemsnit DESC LIMIT 3
Avatar billede latrell Nybegynder
30. november 2006 - 19:35 #12
Jamen den tager jo stadig efter alle artikler, og ikke kun de artikler der er skrevet indenfor de seneste 14 dage? :-)
Avatar billede coderdk Praktikant
30. november 2006 - 22:16 #13
Aaah prøv:

SELECT a.*, AVG(b.vurdering) AS gennemsnit FROM artikler AS a INNER JOIN artikel_kommentarer AS b ON a.id = b.idid GROUP BY b.idid HAVING DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= a.tid ORDER BY gennemsnit DESC LIMIT 3
Avatar billede latrell Nybegynder
30. november 2006 - 22:44 #14
Det virker desværre ikke helt - den hiver en artikel der slet ikke er bedømt op foran en artikel der har fået en vurdering med 4 stjerner :-)
Avatar billede latrell Nybegynder
30. november 2006 - 22:48 #15
Ahh min fejl! Jeg glemte lige at sætte DESC på *lol*

Det virker jo perfekt :-)

Mange tak skal du have!!
Avatar billede coderdk Praktikant
30. november 2006 - 23:01 #16
Så lidt :)
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