Avatar billede Kerouac Nybegynder
06. maj 2010 - 17:30 Der er 17 kommentarer og
1 løsning

tælle antal navne i tabel

Jeg har en top5-liste som er baseret på en optælling af hvor mange gange et navn optræder i en database-tabel.

Nedenstående script skriver listen ud, så det navn som optræder fleste gange står øverst med med antallet i parentes. Hvis et navn optræder 10 gange står tallet 10 med fed skrift i parentesen.

Udskriften ser sådan ud:

Anders Hansen (10)
Lise Jensen (10)
Hans Nielsen (10)
Niels Larsen (9)
Poul Knudsen (6)

og her er koden bag:

$foresp = mysql_query("SELECT COUNT(*) AS antal, brugernavn FROM navne GROUP BY brugernavn ORDER BY antal DESC LIMIT 5");
while($data = mysql_fetch_array($foresp)){
if ($data[antal] = 10) {
echo "$data[brugernavn] - <span style=\"font-weight:bold;\">$data[antal]</span><br>";
}
else {
  echo "$data[brugernavn] - $data[antal]<br>";
}
}

Mit spørgsmål er: hvordan sikrer jeg mig, at Anders Hansen bliver ved med at stå øverst?. Hvis Niels Larsen fx bliver tilføjet tabellen en gang til, kommer han også op på 10, men det er tilfældigt, om han kommer til at stå ovenover eller under Anders Hansen.

Jeg vil altså gerne sikre mig, at den hvis navn først optræder 10 gange i databasen bliver ved med at stå øverst?

Kan I give mig en ide om, hvordan det gøres?
Avatar billede Slettet bruger
06. maj 2010 - 17:42 #1
Du kan benytte flere "felter" i ORDER BY f.eks:
ORDER BY antal, brugernavn DESC

Om det så dur, i kombination med DESC, GROUP BY og COUNT - må et eksperiment vise..

Glæder mig til at høre svaret...
Avatar billede zips Juniormester
06. maj 2010 - 19:08 #2
Det kræver du ved noget unikt som hænger samme med den som du ønsker øverste.

Hvordan ser din table ud, indsætte du en dato for opdatering eller andet som kan bruges til at se hvem som har stået længst tid med højest point.
Avatar billede Slettet bruger
06. maj 2010 - 17:45 #3
Hov, du skal specificere DESC/ASC separat for hver kolonne:
ORDER BY antal DESC, brugernavn ASC
Avatar billede claes57 Ekspert
06. maj 2010 - 17:47 #4
du skal nok have en tabel mere med noget i stil med
brugernavn, dato/tid, antal
og så lave et gennemløb på alle brugere hvor du stk for stk finder antal - er det højere end antal i tabellen, så opdatér antal og dato/tid.
så kan du bruge denne tabel til at finde din top5 liste sorteret på antal, dato/tid
Og det virker også med andre tal en lige 10 som stop.
Hvis du kun går efter '10', så kan du nøjes med at lave et kald med top5 i stedet for at gennemløbe alle brugere, og køre disse igennem - hvis de ikke er i tabellen i forvejen, så skal de oprettes med dagsdato/tid + antal.
Men stadig - dette gøres så lige før du laver kaldet til top5-tabellen, og fra den viser resultatet.
Avatar billede Slettet bruger
06. maj 2010 - 17:55 #5
Ah, fik ikke lige set:
"Jeg vil altså gerne sikre mig, at den hvis navn først optræder 10 gange i databasen bliver ved med at stå øverst?"

Regnede bare med at de skulle komme alfabetisk inden for gruppen.
Avatar billede Kerouac Nybegynder
06. maj 2010 - 18:11 #6
Tak for svarene indtil nu ... jeg tester pt om jeg kan få det til at virker ud jeres forslag.

@T4NK3R: ja, det er rigtigt ... dit forslag lister de med 10 navne i alfabetisk orden og ikke efter hvem der først optræder med 10 navne i tabellen :-)
Avatar billede showsource Seniormester
06. maj 2010 - 18:34 #7
Har du ikke et autoincrement felt i tabellen ?


ORDER BY antal, id DESC
Avatar billede Kerouac Nybegynder
06. maj 2010 - 18:45 #8
Jo - men ORDER BY antal, brugerID ASC sorterer de med 10 navne i tabellen efter hvem af dem, hvis navn først er blvet tilføjet tabellen, og det er ikke nødvendigvis ensbetydende med at denne person også er den hvis navn først optræder 10 gange.
Avatar billede Kerouac Nybegynder
06. maj 2010 - 19:26 #9
Nej ... lige pt indsætter jeg ikke en dato, men jeg kan jo godt gøre det sådan at hver et navn bliver tilføjet tabellen også tilføjer en dato ... kan du giver mig et bud på hvordan koden skal se ud hvis jeg skal beregne hvem som har stået længst tid med højest point.
Avatar billede zips Juniormester
06. maj 2010 - 19:34 #10
Jeg vil mene du kan gøre som showsource skriver i #6 blot udskift id med din dato.

Dvs at den sortere først efter point og dem som har samme point vil derefter blive sorteret efter dato.
Avatar billede Kerouac Nybegynder
06. maj 2010 - 19:38 #11
Det lyder helt rigtigt ... det må så komme an på om jeg kan sætte det korrekt op ... tester lige og så kan I dele pointene
Avatar billede Kerouac Nybegynder
06. maj 2010 - 20:10 #12
Jeg kan ikke få det til at virke her og nu, men det jeg vil gøre, er, når jeg tilføjer et navn, at teste på om vedkommende kommer op på 7 rigtige, og hvis det er tilfældet, vil jeg tilføje en tidsangivelse i forbindelse med dette navn, som der så dernæst kan sorteres på.

Tak for hjælpen ... det bør give points til både zips og showsource
Avatar billede showsource Seniormester
06. maj 2010 - 20:50 #13
Jeg troede du ville ha' med flest point, og sidst tilføjet.
Altså to har begge 8 point, men den som kom sidst på 8, skal vises først.

At sortere efter længst tid på otte, er noget andet ?

ORDER BY antal DESC, dato ASC

måske ?
Avatar billede showsource Seniormester
06. maj 2010 - 20:53 #14
ORDER BY antal DESC, dato, brugernavn ASC
Avatar billede Kerouac Nybegynder
06. maj 2010 - 21:17 #15
Det er ikke så nemt at forklare :-)

Jeg vil gerne have "flest point, og først tilføjet.
Altså to har begge 8 point, men den som kom først på 8, skal vises øverst på listen.

Men som sagt - det at jeg ikke kan få det til at virke, gør ikke jeres svar mindre rigtige :-)

Jeg accepterer dit svar ... og må så prøve mig frem selv herfra
Avatar billede showsource Seniormester
06. maj 2010 - 21:30 #16
Jeg springer over point.

Og er ikke helt sikker på præcis hvad du vil/gør.
Avatar billede Kerouac Nybegynder
06. maj 2010 - 21:33 #17
Beklager at jeg ikke kan forklare mig mere præcist - men tak for den ihærdige indsats anyway :-)
Avatar billede Kerouac Nybegynder
09. maj 2010 - 19:32 #18
Så lukker jeg spørgsmålet.
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