Avatar billede maron Nybegynder
26. juni 2007 - 13:10 Der er 29 kommentarer og
1 løsning

group by brugernavn

Selve group by funktionen virker, men jeg får ikke sorteret resultatet korrekt.

sql = "SELECT brugernavn, count(*) AS antal FROM fotos WHERE foto = 'ok' GROUP BY brugernavn ORDER BY id DESC LIMIT 10"
Set rs = Conn.Execute(sql)

Jeg har 100 fotos fra 10 forskellige bruger, så her vises 10 bruger med hver 1 foto, men foto'et der kommer ud er efter id det ældste, og skal i stedet været det nyeste, nogen der kan se en løsning på det?
Avatar billede mikkelk Nybegynder
26. juni 2007 - 13:19 #1
sql = "SELECT brugernavn, count(*) AS antal FROM fotos WHERE foto = 'ok' GROUP BY brugernavn ORDER BY id LIMIT 10"
Set rs = Conn.Execute(sql)
Avatar billede mikkelk Nybegynder
26. juni 2007 - 13:20 #2
...
Avatar billede fennec Nybegynder
26. juni 2007 - 13:24 #3
Come again??

Du trækker hvilket billed ud?? Jeg kan kun se du trækker brugernavnet ud og hvor mange billeder denne har.
Avatar billede maron Nybegynder
26. juni 2007 - 13:30 #4
Sådan her.

sql = "SELECT brugernavn, billedID, count(*) AS antal FROM fotos WHERE foto = 'ok' GROUP BY brugernavn ORDER BY id DESC LIMIT 10"
Set rs = Conn.Execute(sql)

Jeg kan ikke bare fjerne DESC fordi, så vises der godt nok det nyeste foto, men helt nede i bunden af siden.

fennec >> måske skal sql'en skrives på en helt anden måde?
Avatar billede mikkelk Nybegynder
26. juni 2007 - 13:30 #5
Ja, ok...kan godt se det gik lidt stærkt :-)
Men... jeg er ikke helt med på hvor du vil hen? Du skriver "men foto'et der kommer ud er efter id det ældste" - hvornår kommer det foto ud?
Avatar billede mikkelk Nybegynder
26. juni 2007 - 13:34 #6
ok...hmm...du kan jo ikke umiddelbart lave en sql med group by brugernavn og så også henter billedid ud... Jeg ville dele det op:
sql1 = "SELECT brugernavn, count(*) AS antal FROM fotos WHERE foto = 'ok' GROUP BY brugernavn ORDER BY id DESC LIMIT 10"
sql2 = "SELECT billedid from fotos where brugernavn = '" & brugernavn "' order by billedID desc LIMIT 0,1"
Avatar billede fennec Nybegynder
26. juni 2007 - 13:38 #7
Hvilken version af MySQL bruger du, for der skal laves inner select, og det er forskellig fra versionerne hvor meget der er understøttet.

Forhåbentlig kører du 5 :o)
Avatar billede maron Nybegynder
26. juni 2007 - 13:41 #8
MySql version 4.0.17

Kan jeg evt. opgrader MySql til 5.0 eller nyere uden at hele sitet bryder ned?
Avatar billede fennec Nybegynder
26. juni 2007 - 14:04 #9
Vi skal lige have bestemt din database opbygning. Du har en fotos tabel. Hvilke kolonner er hvad i den, og hvad indeholder de?? billedID er det f.eks primærnøgle?
Avatar billede maron Nybegynder
26. juni 2007 - 14:13 #10
brugernavn er varchar
billedID er varchar
ID er primærnøgle
Avatar billede maron Nybegynder
26. juni 2007 - 14:29 #11
Det jeg jo ude efter er at brugernavnet kun vises en gang med det nyeste foto.
Så burde distinct egentlig ikke kunne klare det??

sql = "SELECT distinct brugernavn, billedID FROM fotos WHERE foto = 'ok' ORDER BY id DESC LIMIT 10"
Set rs = Conn.Execute(sql)
Avatar billede fennec Nybegynder
26. juni 2007 - 14:31 #12
Hvilke type data er der indsat i billedID?? Er det et filnavn, eller et ID som referere til en anden tabel?
Avatar billede kaptajnknas Nybegynder
26. juni 2007 - 14:43 #13
billedID er genereret tal ud fra dato og sessionID eks. 25695654574
Avatar billede maron Nybegynder
26. juni 2007 - 14:45 #14
Nå, det var min brors konto, men som sagt:
billedID er genereret tal ud fra dato og sessionID eks. 25695654574
Avatar billede fennec Nybegynder
26. juni 2007 - 14:51 #15
Ok, så ikke noget der kan bruges til en nem løsning :(

Den sql du skal bruge er noget ala:
select brugernavn, count(*) AS antal, (select billedID from fotos f1 where f1.brugernavn=f.brugernavn order by id desc limit 1) as pic FROM fotos f WHERE f.foto = 'ok' GROUP BY f.brugernavn"

Virker vist kun i 5.0 eller nyere...
Avatar billede fennec Nybegynder
26. juni 2007 - 14:52 #16
Manglede vist nogle f of f1 for en sikkerheds skyld:
select f.brugernavn, count(f.id) AS antal, (select f1.billedID from fotos f1 where f1.brugernavn=f.brugernavn order by f1.id desc limit 1) as pic FROM fotos f WHERE f.foto = 'ok' GROUP BY f.brugernavn"
Avatar billede maron Nybegynder
26. juni 2007 - 15:08 #17
Så må jeg se om jeg kan finde MySql 5.0 ??
Og den kan uden videre opgradere en gammel 4.0.17?
Avatar billede fennec Nybegynder
26. juni 2007 - 15:17 #18
Det skulle jeg mene, men tag en backup inden for en sikkerheds skyld...
Avatar billede maron Nybegynder
26. juni 2007 - 15:24 #19
Hm. det virker meget indviklet group by der.
Er der slet ingen mulighed for at løse dette med noget "distinct array (loop)"?
Avatar billede fennec Nybegynder
26. juni 2007 - 15:27 #20
Nej, eneste anden måde er at lave det i en løkke:
set rs = conn.execute("select distinct brugernavn from fotos")
while not rs.eof
  set rs1 = conn.execute("select billedid from fotos where brugernavn = '" & rs("brugernavn") "' order by ID desc limit 1")
  rs.MoveNext
wend
Avatar billede maron Nybegynder
26. juni 2007 - 15:40 #21
Jeg er ikke med, hvad skulle den rs1 gøre?
Kan du ikke prøve at skrive koden, og så med en smule forklaring, skulle jo gerne lære lidt af det.:-)
Avatar billede fennec Nybegynder
26. juni 2007 - 16:00 #22
rs henter alle brugere. rs1 henter billedet ud for brugeren:

'Hent alle brugernavn distinct så de kun kommer en gang hver
set rs = conn.execute("select distinct brugernavn from fotos")

'Løb brugernavne igennem
while not rs.eof

  'Hent det seneste billed for den aktuelle bruger
  set rs1 = conn.execute("select billedid from fotos where brugernavn = '" & rs("brugernavn") "' order by ID desc limit 1")

  ... Noget kode som sikkert udskriver brugernavn og billed ...

  'Gå til næste række
  rs.MoveNext
wend
Avatar billede maron Nybegynder
26. juni 2007 - 16:46 #23
Der er fejl i linien rs1
Expected ')'
men hvor mangler der et )?

Desuden er det muligt at køre et loop i et loop? for det kommer jeg til.
Avatar billede fennec Nybegynder
27. juni 2007 - 09:12 #24
Du kan køre alle de loops i loops du vil.

Prøv at smide din kode herind som du har den lige nu, for jeg kan ikke se der mangler en )
Avatar billede maron Nybegynder
27. juni 2007 - 17:53 #25
Her er koden det drejer sig om.

<%
set rs = conn.execute("select * from fotos WHERE godkendt = '1' ORDER BY ID DESC LIMIT "& currentPage &","& pageSize &"")
if not rs.eof then
do while not rs.eof

isonline = false

For idx = LBound(brugernavneArr) To UBound(brugernavneArr)
If rs("foto") = fotoArr(idx) Then
isonline = True
Exit For
End If
Next

if isonline then
response.write("Online: <img border=""0"" src=""minifotos/" & rs("billedID") & """>")
else
response.write("Offline: <img border=""0"" src=""minifotos/" & rs("billedID") & """>")
end if


rs.movenext
loop
end if
%>
Avatar billede fennec Nybegynder
28. juni 2007 - 08:39 #26
Eneste problem jeg kan se i den kode, er hvis currentPage eller pageSize ikke har en værdi.
Avatar billede maron Nybegynder
28. juni 2007 - 12:50 #27
Der er ikke noget problem i den kode jeg har vist, currentPage eller pageSize får en værdi i starten af scriptet.
Men loop'en du foreslog tidligere skal jo bygges på..
Avatar billede fennec Nybegynder
28. juni 2007 - 13:06 #28
Jeg er overhoved ikke med på hvor du vil have det smidt ind...

Du har allerede en select hvor du henter alt ud fra fotos (med lidt paging), men hvad skal du så bruge alle brugernavne til inden i den løkke??
Avatar billede maron Nybegynder
28. juni 2007 - 13:21 #29
Den løkke indikerer et status forhold på hver enkelt billed.
Det er her jeg har brug for at finde det korrekt id

set rs = conn.execute("select * from fotos WHERE godkendt = '1' ORDER BY ID DESC LIMIT "& currentPage &","& pageSize &"")

Jeg kan bare ikke se hvordan du vil kunne loope i 1 recordset og samtidig loope længere nede i response.write?
Ved ikke om jeg forklare mig tydeligt nok?
Avatar billede maron Nybegynder
28. juni 2007 - 23:01 #30
Det her gider jeg ikke, finder hjælp et andet sted.
Lukker spg.
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

Seneste spørgsmål Seneste aktivitet
I dag 16:10 Tomt felt i Start Af ErikHg i Windows
I går 23:00 Hyperlink til tekst Af Nanarsi i Excel
18/0121:03 Forlænge ringetid Af 1Dorte i Apps til Android
17/0117:38 Video ikoner Af Malm i Windows
17/0117:27 Video ikoner Af logbuilders i Windows