Avatar billede Slettet bruger
31. juli 2002 - 09:59 Der er 22 kommentarer og
2 løsninger

Tælle og vise antal beskeder

Hej...

Jeg har 2 tabeller i databasen:
- brugere
- beskeder

Når en bruger smider en besked i databasen får denne besked et brugerid (som er lig med brugerens id fra tabellen brugere).

Det jeg ønsker er flg.:

Jeg vil gerne vise antal beskeder pr. bruger i stil med:
- peter 4
- claus 3
- brian 1
osv... (hvor navnet er brugernavnet)

Jeg skal altså trække ud fra 2 tabeller og tælle på samme tid.

Felterne i tabellen brugere:
- brugerid
- brugernavn

Felterne i tabellen beskeder:
- frabrugerid (svarer til brugerid i tabellen brugere)
- besked

Håber I kan hjælpe...
Avatar billede cthun Nybegynder
31. juli 2002 - 10:07 #1
strSQL1 = "select * from brugere"
set rs = conn.execute(strSQL1)

do while not rs.eof

strSQL2 = "SELECT COUNT(*)
AS intCount FROM beskeder where id = " & rs("id")
set rs2 = conn.execute(strSQL2)

response.write rs("bruger") & " - " & rs2("intCount")

rs.movenext
Loop
Avatar billede The Real Yoda Juniormester
31. juli 2002 - 10:07 #2
hvis det er en MSsQl så kan du bruge innerjoins..  det ved jeg ikke om du kan på MySql..

Hvilke databse kører du på ?

hvis det er MySql så gør du således

sql="Select * from brugere"
set brugere=rs.execute(sql)
do while not brugere.eof
sql="select count(*) as antal from beskeder where frabrugerid="&brugere("brugerid")
set beskeder=rs.execute(sql)
response.write brugere("brugernavn")&" ("&beskeder("antal")&")"
brugere.movenext
loop

Dette virker på både MySql og MsSql
Avatar billede cwb Nybegynder
31. juli 2002 - 10:07 #3
prøv.

Select u.brugernavn, count(b.frabrugerid)
from  brugere u
join  beskeder b on (b.frabrugerid = u.brugerid)
group by u.brugerid, u.brugernavn
Avatar billede cthun Nybegynder
31. juli 2002 - 10:08 #4
Du skal selvfølgelig ændre tabelnavnene til hvad de i virkeligheden hedder!
Avatar billede The Real Yoda Juniormester
31. juli 2002 - 10:08 #5
bittert at være 19 sekunder for sent på den... :-)
Avatar billede soerens Nybegynder
31. juli 2002 - 10:08 #6
Hvilken database taler vi om? Access? MS SQL? MySQL?
Avatar billede Slettet bruger
31. juli 2002 - 10:11 #7
Det er access...
Avatar billede eagleeye Praktikant
31. juli 2002 - 10:11 #8
Din SQL kan se sådan ud:

SQL = "SELECT Count(beskeder.frabrugerid) AS antalBeskeder, brugere.brugernavn FROM brugere INNER JOIN beskeder ON brugere.brugerid = beskeder.frabrugerid GROUP BY brugere.brugernavn ORDER BY Count(beskeder.frabrugerid) DESC;"
set rs = conn.execute(SQL)

'udskrive:
do while not rs.EOF
  Response.write "- " & rs("brugernavn") & " " & rs("antalBeskeder") & "<br>"
  rs.movenext
loop
Avatar billede cwb Nybegynder
31. juli 2002 - 10:12 #9
ved at bruge min sql får du hentet begge felter i samme hug. Det vil sige at du får et datasæt at arbejde med istedet for som i de andre eksempler at skulle løbe et datasæt igennem for at danne et andet.
Avatar billede eagleeye Praktikant
31. juli 2002 - 10:12 #10
den jeg har vist laver et utput som du har skrevet i spørgsmålet:

- peter 4
- claus 3
- brian 1
Avatar billede cwb Nybegynder
31. juli 2002 - 10:13 #11
undskyld eagleeye men er din sql egentlig ikke den samme som den jeg lige har skrevet ?

Ikke for at komme med sure opstød :-)
Avatar billede eagleeye Praktikant
31. juli 2002 - 10:17 #12
Min passer med han tabel og kolonne navne, den sortere så det den med flest beskeder kommet først og den med mindst komme sidst.

Og så har jeg vist hvordan man skriver det ud :)
Avatar billede cthun Nybegynder
31. juli 2002 - 10:18 #13
<% DSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("dindb.mdb")
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open DSN
%>
<html>
<head>
</title>Hejsa</title>
</head>
<body>
<%
strSQL1 = "select * from brugere"
set rs = conn.execute(strSQL1)

do while not rs.eof

strSQL2 = "SELECT COUNT(*)
AS intCount FROM beskeder where id = " & rs("id")
set rs2 = conn.execute(strSQL2)

response.write rs("bruger") & " - " & rs2("intCount")
rs.movenext
Loop
%>
</body>
</html>
Avatar billede eagleeye Praktikant
31. juli 2002 - 10:25 #14
Jeg vil støtte cwb i kommentar (31/07-2002 10:12:20). De er bedst at få databasen til at lave arbejdet en gang, så ungår man skal kade til databasen X antal bruger gange ligeledes kan man ikke sortere på den måde.

Derfor brug cwb's og mit forslag.
Avatar billede Slettet bruger
31. juli 2002 - 10:39 #15
cwb > Hvordan vil hele din SQL så se ud?
Avatar billede Slettet bruger
31. juli 2002 - 10:41 #16
ah - ok - læste forkert - kan prøve med dit, eagleeye.
Avatar billede eagleeye Praktikant
31. juli 2002 - 10:44 #17
Ja, det er samme metode vi har brugt.
Avatar billede cwb Nybegynder
31. juli 2002 - 10:45 #18
ja prøv eagleeye's forslag. vores sql forslag er mere eller mere identiske men eagleeye har været flink og lave benarbejdet med at få udskrevet felterne.
Avatar billede Slettet bruger
31. juli 2002 - 10:52 #19
Virker fint - lige et tillægsspørgsmål, hvis jeg kan få sneget det ind :-)

HVIS man nu kun ønsker at vise eks. top 3 - altså de 3 brugere der har sendt flest, hvordan er så lige den select skal se ud?
Avatar billede eagleeye Praktikant
31. juli 2002 - 10:54 #20
så kn du tilføje top 3 i SQL sætningen..:

SQL = "SELECT TOP 3 Count(beskeder.frabrugerid) AS antalBeskeder, brugere.brugernavn FROM brugere INNER JOIN beskeder ON brugere.brugerid = beskeder.frabrugerid GROUP BY brugere.brugernavn ORDER BY Count(beskeder.frabrugerid) DESC;"
Avatar billede Slettet bruger
31. juli 2002 - 10:59 #21
ah.. ja klart.

Tak for hjælpen!
Avatar billede Slettet bruger
31. juli 2002 - 14:29 #22
Hov - ville lige spørge - hvis jeg skal snige en

WHERE noget = true

ind i SQL'en:

SQL = "SELECT Count(beskeder.frabrugerid) AS antalBeskeder, brugere.brugernavn FROM brugere INNER JOIN beskeder ON brugere.brugerid = beskeder.frabrugerid GROUP BY brugere.brugernavn ORDER BY Count(beskeder.frabrugerid) DESC;"

Hvor skal den så placeres?
Avatar billede Slettet bruger
31. juli 2002 - 14:29 #23
Det er ift. beskeder - nemlig hvis det er en sms.
Avatar billede eagleeye Praktikant
31. juli 2002 - 17:10 #24
SQL = "SELECT Count(beskeder.frabrugerid) AS antalBeskeder, brugere.brugernavn FROM brugere INNER JOIN beskeder ON brugere.brugerid = beskeder.frabrugerid WHERE noget = true GROUP BY brugere.brugernavn ORDER BY Count(beskeder.frabrugerid) DESC;"
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