Avatar billede g1mzee Nybegynder
18. marts 2010 - 17:10 Der er 10 kommentarer

2 selects i en query

Hej eksperter.
Jeg fjoller lidt rundt med min svendeprøve for tiden, men jeg står med et lille problem..

opgave: Jeg skal have en hit liste, som der viser de 20 produkter der har fået flest votes den seneste måned.
jeg har min produkt tabel hvori mine produkter ligger, derudover har jeg en vote tabel, hvori alle de stemmer der er givet ligger.

produkt:
product_id (int)
product_name (varchar)

vote:
vote_id (int)
fk_product_id (int)
create_vote (timestamp)

Dette burde være de relevante felter til queryen.

Det jeg skal have ud er: produkt_id, product_name til at vise på siden. Derudover skal jeg jo have talt sammen hvor mange votes produkterne har fået, og derefter få de 20 der har fået flest indenfor den sidste måned.

håber at det giver mening :p
Avatar billede erikjacobsen Ekspert
18. marts 2010 - 17:21 #1
Du skal vel lave en join på produkt_id, og en group by
Avatar billede g1mzee Nybegynder
18. marts 2010 - 18:59 #2
kunne være en mulighed,
Samt jeg skal have en count() så jeg får ud hvor mange der er af votes.

Kunne du eventuelt lave et eksempel ?
Avatar billede erikjacobsen Ekspert
18. marts 2010 - 19:02 #3
Ja, du skal have en count(*) i forbindelse med group by. Prøv at lav det selv - det er din prøve.
Avatar billede g1mzee Nybegynder
18. marts 2010 - 20:25 #4
jeg havde prøvet med en produkt tabel og en image tabel jeg har på min egen server, da jeg ikke har tilgang til svendeprøve serveren udenfor skoletiden.
Men jeg kom frem til dette, som gav det ønskede svar. Hvertfald på den server, dog skal jeg lige have: where create_date > timestamp for en måned siden.

select
p.product_id,
p.title,
count(v.vote_id) as votes
from
product as p
left join
vote as v
ON
p.product_id = v.fk_product_id
group by p.product_name
order by votes DESC
Avatar billede erikjacobsen Ekspert
18. marts 2010 - 21:30 #5
Princippet ser helt korrekt ud.
Avatar billede g1mzee Nybegynder
18. marts 2010 - 21:35 #6
Jeg prøver det imorgen,

Men tak for tippet ! :)
Avatar billede showsource Seniormester
19. marts 2010 - 07:42 #7
WHERE v.create_vote > DATE_SUB(NOW(), INTERVAL 1 MONTH)

før din group by

create_vote er vel YYYY-MM-DD ???
Avatar billede g1mzee Nybegynder
19. marts 2010 - 08:21 #8
Nej den er et timestamp
Avatar billede showsource Seniormester
19. marts 2010 - 12:55 #9
Altså et unix timestamp ?

Kunne vist laves i sql,
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

men jeg ville nok gøre så'n:

$oldtime = strtotime("1 month ago", strtotime(date("Y-m-d")));

p.product_id = v.fk_product_id
WHERE v.create_vote > ".$oldtime."
group by p.product_name
Avatar billede showsource Seniormester
19. marts 2010 - 13:07 #10
I sql

WHERE v.create_vote > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
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