06. maj 2010 - 17:30Der 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?
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
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..
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.
Synes godt om
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.
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 :-)
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.
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.
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
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.