Avatar billede fynbo Nybegynder
16. marts 2006 - 15:53 Der er 12 kommentarer

beregne gennemsnit i sql forespørgsel

Hej,

Jeg har en database med 8000 artikler og nu vil jeg gerne lave en 'mest sete artikler de seneste 14 dage' liste.

Jeg er bare stødt ind i et problem.

I basen har jeg to tabeller - article og article_views. I article_view indsættes hver nat en række for hver article, som indeholder hvor mange gange artiklen har været vist samt unix_timestamp for hvornår rækken blev indsat.

Dvs for artikel 88 kan article_views se sådan ud:

Id View Date
88 1219 1142376932
88 1219 1142290529
88 1215 1142117738
88 1212 1141685729
88 1210 1141340132

Umiddelbart kan jeg ikke bruge det til noget, det jeg vil er at tage antallet af dage siden artiklen blev lagt online, det felt findes i article.publish_date og dividere med den seneste optælling.

Eftersom jeg ikke har designet databasen eller cronjobbet, har jeg ikke haft mulighed for at lave denne udregning løbende, så mit spørgsmål er om det kan laves direkte via sql?

De to tabeller er knyttet sammen således:
SELECT article_id, viewcounts FROM article_viewcounts LEFT JOIN article ON (article_viewcounts.article_id = article.id) WHERE article.active = 't'
Avatar billede arne_v Ekspert
17. marts 2006 - 02:30 #1
SELECT id,MAX(view) AS count
FROM article_views JOIN article ON article.id=article_views,article_id
WHERE article_views > X
GROUP BY id

eller

SELECT id,SUM(view) AS count
FROM article_views JOIN article ON article.id=article_views,article_id
WHERE article_views > X
GROUP BY id

alt afhængig af om tælleren akkumuleres allerede eller ej
Avatar billede fynbo Nybegynder
17. marts 2006 - 11:07 #2
min idé var at få en dynamisk liste hvor den kunne vise de artikler som var mest læst de seneste 14 dage, jeg benytter allerede overstående i min kode, hvordan kan jeg konstruere en sq-sætning som giver mig det ønskede resultat?
Avatar billede arne_v Ekspert
18. marts 2006 - 02:39 #3
SELECT *
FROM article
WHERE id IN (
SELECT id FROM (
SELECT id,MAX(view) AS count
FROM article_views JOIN article ON article.id=article_views,article_id
WHERE article_views > X
GROUP BY id
ORDER BY count DESC
LIMIT X) temp)

måske
Avatar billede fynbo Nybegynder
18. marts 2006 - 03:23 #4
hvad sætter du X til og hvorfor giver overstående kode en liste over de mestlæste artikler de seneste14 dage? :-O)
Avatar billede arne_v Ekspert
18. marts 2006 - 03:25 #5
det første X er tiden for 14 dage siden
det andet X er det antal artikler du vil se 5, 10, 20 whatever
Avatar billede arne_v Ekspert
18. marts 2006 - 03:27 #6
SELECT id,MAX(view) AS count
FROM article_views JOIN article ON article.id=article_views,article_id
WHERE article_views > X
GROUP BY id
ORDER BY count DESC
LIMIT X

giver id og antal for de X mest viste artikler siden tidspunkt X

så selecter vi id fra det resultat

og så selecter vi alle felter for de artikler som er i den liste
Avatar billede arne_v Ekspert
18. marts 2006 - 03:27 #7
jeg har ikke testet det (jeg har ikke data til det) men ideen lyder brugbar
Avatar billede fynbo Nybegynder
18. marts 2006 - 03:29 #8
ja, okay - men stadig. jeg læser og forstår din sql kode men alligevel forstår jeg ikke hvorfor den kan give de 10, 20 læste artikler de sidste 14 dage? cronjobbet sletter ikke gamle artikler, så hvis en artikel har været læst 20.000 gange i sin levetid, vil den vel altid komme først?
Avatar billede arne_v Ekspert
18. marts 2006 - 03:30 #9
WHERE udføres førend GROUP BY
Avatar billede arne_v Ekspert
07. april 2006 - 05:14 #10
kommet videre ?
Avatar billede arne_v Ekspert
06. oktober 2006 - 03:17 #11
??
Avatar billede klax Nybegynder
17. maj 2007 - 02:41 #12
Hvad med at udbygge arne v's sql sådan:

SELECT id,MAX(view) AS count
FROM article_views JOIN article ON article.id=article_views,article_id
WHERE article_views > X
and unix_timestamp > (now()-14)
GROUP BY id
ORDER BY count DESC
LIMIT X
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