Avatar billede milandt Nybegynder
13. marts 2004 - 01:38 Der er 37 kommentarer og
1 løsning

SQL, SELECT (200 pts)

Hejsa

Jeg har en tabel, rating, den indeholder infornationer om nogle billeder man kan stemme på. Hvert billede har en owner, og en avgrate der er gennemsnittet af de stemmer det pågældende billede har fået. Jeg vil gerne producere en liste af owners sorteret efter hvor gode deres billeder er. Det har jeg gjort sådanher:

SELECT owner AS id, AVG(avgrate) FROM rating WHERE owner <> 0 AND views > 15 GROUP BY owner ORDER BY AVG(avgrate) DESC;

views er antallet af stemmer, og jeg har gjort således at et billede skal ha minst 15 stemmer. Grunden til at jeg siger WHERE owner <> 0 er fordi at der ikke er nogen garanti for at et billede har en owner, og så er owner = 0. Altså, her er en liste over alle owners sorteret efter hvor gode deres billeder er.

Nu vil jeg bare gerne ha den samme liste, men sorteringen skal kun fokusere på hver enkelt owners bedste 25 billeder.... Hvordan gør jeg det??
Avatar billede eagleeye Praktikant
13. marts 2004 - 01:46 #1
Skal den vise de 25 bedste billeder for en bestemt bruger?
Så kan man bruge GROUP BY billedeID hvis der en kolonne som indeholder information omkring hvilket billedet det er:



ownerID = 25
SQL = "SELECT TOP 25 billedeID, AVG(avgrate) FROM rating WHERE owner = " & ownerID & " AND views > 15 GROUP BY billedeID ORDER BY AVG(avgrate) DESC;"
Avatar billede milandt Nybegynder
13. marts 2004 - 01:47 #2
nej, den skal vise en liste over alle brugere, sorteret efter hvem der i snit har de bedste billeder, men det snit skal ikke beregnes på baggrund af alle brugerens billeder, men kun de bedste 25 af brugerens billeder.
Avatar billede eagleeye Praktikant
13. marts 2004 - 01:51 #3
ok så prøv denne, samme princip som før bare med owner <> 0 og igen med billedeID kolonnen:

SQL = "SELECT TOP 25 billedeID, owner as id, AVG(avgrate) FROM rating WHERE owner <> 0 AND views > 15 GROUP BY billedeID ORDER BY AVG(avgrate) DESC;"
Avatar billede milandt Nybegynder
13. marts 2004 - 01:55 #4
:/

You tried to execute a query that does not include the specified expression 'id' as part of an aggreate function.

billedeID hedder i øvrigt name, og det er unikt :) jeg kan godt se logikken i det, kan bare ikke få det til at virke.
Avatar billede eagleeye Praktikant
13. marts 2004 - 01:57 #5
Er det både owner og name på hver rating?

Så prøv:
SQL = "SELECT TOP 25 [name], owner, AVG(avgrate) FROM rating WHERE owner <> 0 AND views > 15 GROUP BY [name] ORDER BY AVG(avgrate) DESC;"
Avatar billede eagleeye Praktikant
13. marts 2004 - 02:00 #6
arh hvert billede har en avgrate så det skal nok være sådan her:

SQL = "SELECT TOP 25 [name], owner, avgrate FROM rating WHERE owner <> 0 AND views > 15 GROUP BY [name] ORDER BY avgrate DESC;"
Avatar billede milandt Nybegynder
13. marts 2004 - 02:00 #7
samme problem, bare

You tried to execute a query that does not include the specified expression 'owner' as part of an aggreate function.

ja, hver row i databasen er info om eet billede. de info består af name, avgrate, owner og views.
Avatar billede milandt Nybegynder
13. marts 2004 - 02:01 #8
^^ fik den fejl ved begge dine forslag
Avatar billede eagleeye Praktikant
13. marts 2004 - 02:02 #9
doh nu det ved at være sent den sidste skal være uden GROUP BY:

SQL = "SELECT TOP 25 [name], owner, avgrate FROM rating WHERE owner <> 0 AND views > 15 ORDER BY avgrate DESC;"
Avatar billede milandt Nybegynder
13. marts 2004 - 02:06 #10
well - jeg får 25 billeder sorteret efter avgrate.. det første billede har lidt over 6 i date og ejes af owner 11.. næste billede ejes oges af owner 11 og et længere nede af owner 26 osv osv..

Forestil dig at man tager owner 1, og regner gennemsnittet ud på hans bedste 25 billeder. Det gennemsnit er måske 4.5

Det gør man så med alle owners, og så sortere man owners således at den owner der skrives først er den hvis 25 bedste billeder udgør det bedste gennemsnit.

Det er ikke en liste af billeder jeg vil ha
Avatar billede milandt Nybegynder
13. marts 2004 - 02:15 #11
er virklig lost :(
Avatar billede eagleeye Praktikant
13. marts 2004 - 02:23 #12
jeg forstår hvad du mener.. kigger lige vidre på det.
Avatar billede milandt Nybegynder
13. marts 2004 - 02:25 #13
nice :)
Avatar billede milandt Nybegynder
13. marts 2004 - 21:12 #14
andre der har forslag?
Avatar billede milandt Nybegynder
15. marts 2004 - 08:56 #15
fandt du en løsning eagleeye :) ?
Avatar billede milandt Nybegynder
15. marts 2004 - 10:58 #16
op
Avatar billede eagleeye Praktikant
15. marts 2004 - 19:30 #17
Hej
Nej, jeg har forsøgt lidt af hvert men jeg kan ikke får den til at tage top 25 fra hver bruger.. Jeg har også søgt på google omkring det og der er stillet et par spørgsmål rundt omkring om det samme eller noget der ligner, men der er heller ikke kommet svar på hvordan man får TOP x fra hver bruger...
Avatar billede milandt Nybegynder
15. marts 2004 - 19:40 #18
damn - bliver nødt til at programmere mig ud af det så (?)
Avatar billede milandt Nybegynder
16. marts 2004 - 16:15 #19
op
Avatar billede milandt Nybegynder
16. marts 2004 - 17:00 #20
op
Avatar billede eagleeye Praktikant
16. marts 2004 - 20:36 #21
Ja så må man programmere det.
Avatar billede milandt Nybegynder
16. marts 2004 - 20:45 #22
håbede jo lidt nogen andre havd et svar
Avatar billede eagleeye Praktikant
16. marts 2004 - 21:29 #23
giv mig lige lidt mere tid jeg tror jeg er ved at havde den som en SQL sætning, indtid vidre har jeg dette, som tager top 25 fra hver gruppe (owner):

SQL = "SELECT * FROM rating yt1 "
SQL = SQL & "WHERE [name] IN (SELECT TOP 25 [name] FROM rating yt2 where yt2.owner = yt1.owner order by yt2.avgrate desc, yt2.name)"
Avatar billede eagleeye Praktikant
16. marts 2004 - 21:31 #24
Prøv med denne:

SQL = "SELECT avg(avgrate), owner FROM rating yt1 "
SQL = SQL & "WHERE [name] IN (SELECT TOP 4 [name] FROM rating yt2 where yt2.owner = yt1.owner order by yt2.avgrate desc, yt2.name) group by owner order by avg(avgrate) desc"
Avatar billede eagleeye Praktikant
16. marts 2004 - 21:31 #25
doh top 4 ---> top 25
Avatar billede milandt Nybegynder
16. marts 2004 - 22:53 #26
scriptet timer ud, selvom det ser fornuftigt nok ud..
Avatar billede milandt Nybegynder
16. marts 2004 - 22:59 #27
data type mismatch in critira expression.. navnene er rigtige nok
Avatar billede milandt Nybegynder
16. marts 2004 - 23:01 #28
Undskyld, det var fordi jeg prøvede at ændre noget. Den fejl der kommer når jeg kører din sætning er denne:

You tried to execute a query that does not include the specified expression 'name' as part of an aggreate function
Avatar billede eagleeye Praktikant
16. marts 2004 - 23:03 #29
hvordan ser den ud?
Avatar billede milandt Nybegynder
16. marts 2004 - 23:06 #30
SQL = SQL & "WHERE [name] IN  << havde bare ændret name til owner.. men har ikke overblik til at se hvad jeg skal ændre/rette for at få det til at virke..
Avatar billede milandt Nybegynder
16. marts 2004 - 23:13 #31
Noget andet er, hvis jeg prøver i Access at køre denne sql sætning du skrev du mente ville tage top 25 fra hver gruppe (owner), så går Access ned..

SQL = "SELECT * FROM rating yt1 "
SQL = SQL & "WHERE [name] IN (SELECT TOP 25 [name] FROM rating yt2 where yt2.owner = yt1.owner order by yt2.avgrate desc, yt2.name)"
Avatar billede eagleeye Praktikant
16. marts 2004 - 23:13 #32
Den skulle virke, men har du mange records?
Skal det med views > 15 også med?

hvis du retter WHERE [name] til owner så skal det også rettes i SELECT TOP 4 [name] FROM til owner
Avatar billede eagleeye Praktikant
16. marts 2004 - 23:42 #33
Den virker fint hos mig, på en access dog har jeg også kun nogle få poster..

Alternativt skal du prøve denne, men jeg tror ikke det bliver bedre af det:

SQL = "SELECT owner, AVG(avgrate) AS Best3OfLast4PurchaseAvg, count(avgrate) FROM "
SQL = SQL & "(SELECT owner, avgrate FROM rating C WHERE [name] IN "
SQL = SQL & "(SELECT TOP 25 [name] FROM (SELECT owner, [name], avgrate FROM rating A WHERE [name] IN "
SQL = SQL & "(SELECT [name] FROM rating WHERE owner=A.owner) "
SQL = SQL & "ORDER BY avgrate DESC, [name] desc) AS B "
SQL = SQL & "WHERE B.owner=C.owner ORDER BY avgrate DESC, [name])) AS X "
SQL = SQL & "GROUP BY owner ORDER BY avg(avgrate) DESC"
Avatar billede eagleeye Praktikant
16. marts 2004 - 23:47 #34
hmm den første linje:
SQL = "SELECT owner, AVG(avgrate) AS Best3OfLast4PurchaseAvg, count(avgrate) FROM "

skal vist være sådan her, men det giver det samme:
SQL = "SELECT owner, AVG(avgrate) FROM "
Avatar billede milandt Nybegynder
17. marts 2004 - 11:23 #35
Ja, har ca 5000 records.

Den sidste du skrev kan Access heller ikke afvikle. Ved ikke om det er fordi der er en fejl i SQL-sætningen, eller om det bar er fordi den er så tung at det tager 10 mins at afvikle den.

I mellemtiden har jeg programmeret mig ud af det med et "tilfredsstillende" resultat. Hvis du stadig gerne vil prøve at finde en løsning på problemet, så kan jeg godt sende dig databasen.

Kan godt acceptere "Ja så må man programmere det" som svar hvis det er. Tak for hjælpen i al flad. :)
Avatar billede eagleeye Praktikant
19. marts 2004 - 11:36 #36
Der er ikke fejl i SQL sætningen den virker fint hos mig.

Det er en meget tung SQL sætning fordi man er nød til at lave en JOIN yt2.owner = yt1.owner på owner kolonne for at kunne få top 25 fra hver bruger.
Så udervejs er man oppe på Owner1*Owner1+Owner2*Owner2+Owner3*Owner3+Owner4*Owner4+... records, så når du har 5000 records vel den nok tage en del tid at udføre.

Jeg har ikke umiddelbart flere ideer til det..
Avatar billede trer Nybegynder
21. marts 2004 - 01:12 #37
milandt> Hvad med at få lukket dette spørgsmål?

http://www.eksperten.dk/spm/475833
Avatar billede milandt Nybegynder
21. marts 2004 - 23:54 #38
trer: done.

eagleeye: tager dig på ordet, og at det virker. med 5000 records kan jeg godt se at den fremgangsmåde du har lavet bliver meget tung, og sikkert ikke kan køres.. men tager dig på ordet med at det virker på færre records. tak for al den tid du har brugt på det her.
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
Kurser inden for grundlæggende programmering

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