Avatar billede simotho Nybegynder
15. december 2009 - 22:05 Der er 12 kommentarer

Rangliste system

Hvordan man tjekker hvor man ligger i databasen i forhold til hvor mange penge man har
Eksempel:


ID                        Penge
1                          4324
2                          1322
3                          20
4                          123
5                          321

Hvordan kan man så tælle i databasen hvilken position man ligger.

Hvis jeg f.eks var ID 3 skulle den udskrive "Du ligger nummer 5 ud af 5" eksempelvis
Avatar billede wanze Nybegynder
16. december 2009 - 04:01 #1
Jeg ved ikke om det her er den mest optimale måde at gøre det på, men det er i hvert fald en løsning:
set @i:=0;
select `Rang` from
  (select `ID`,@i:=@i+1 as `Rang` from `tabel` order by `Penge` desc) as a
where `ID` = '3'

Først sættes der en variabel @i. Herefter løbes tabellen igennem med den, der har flest penge først og den der har færrest sidst. Disse tildeles løbende den værdi @i har på pågældende tidspunkt, hvergang den løbes igennem forøges @i med én. Den skaber altså en midlertidig tabel (navngivet a), der vil se sådan her ud:


ID  Rang
1    1
2    2
5    3
4    4
3    2

Ud af denne midlertidige tabel hentes så Rang.
Avatar billede simotho Nybegynder
16. december 2009 - 07:58 #2
Tak for budet. Er det PHP du koder i? :|
Avatar billede simotho Nybegynder
16. december 2009 - 09:47 #3
Dit svar virkede desværre ikke, andre der kan byde ind?
Avatar billede repox Seniormester
16. december 2009 - 12:30 #4
En lidt grim løsning, men som virker:


<?php

  $sql = "SELECT ID, Penge FROM tabel ORDER BY Penge ASC";
  $query = mysql_query($sql);
  $antal = mysql_num_rows($query);

  $i = 1;
  while($row = mysql_fetch_assoc($query))
  {
    if($row["ID"] == $mitBrugerId)
      break;

    $i++;
  }

  echo "Du er nr ".$i." ud af ".$antal;

?>

Avatar billede Slettet bruger
16. december 2009 - 14:42 #5
SELECT
    COUNT(*) + 1 AS `number`
FROM
    `table`
WHERE
    `Penge` > (
        SELECT
            `Penge`
        FROM
            `table`
        WHERE
            `ID` = '3'
    )
Avatar billede simotho Nybegynder
16. december 2009 - 20:20 #6
Dette eksempel virker

<?php

          $sql = "SELECT id, penge FROM users ORDER BY penge ASC";
         
          $query = mysql_query($sql);
          $antal = mysql_num_rows($query);

          $i = 1;
          while($row = mysql_fetch_assoc($query))
          {
            if($row["id"] == $sid)
              break;

            $i++;
          }

          echo "Du er nr ".$i." ud af ".$antal;

        ?>

Men hvis man ligger nummer 1 skriver den, at man ligger nummer 28 f.eks ud af 28. Der burde jo stå 1 ud af 28? :)
Avatar billede wanze Nybegynder
16. december 2009 - 21:25 #7
Både min og kvadratrodenaf1s løsning virker også, kvadratrodenaf1s er dog den bedste.

repox's læsning er meget tung og du henter en masse data du ikke skal bruge. Brug nu blot den løsning kvadratrodenaf1 har skrevet.
Avatar billede simotho Nybegynder
16. december 2009 - 21:29 #8
Har prøvet med denne kode:

<?php

          $sql = "SELECT COUNT(*) + 1 AS `number` FROM `users` WHERE `penge` > (SELECT `penge` FROM `users` WHERE `id` = '3')";
         
          $query = mysql_query($sql);
          $antal = mysql_num_rows($query);


          echo "Du er nr ".$query['number']." ud af ".$antal;

        ?>

den udskriver:
   

Du er nr ud af 1

Hvad gør jeg forkert? :)
Avatar billede wanze Nybegynder
16. december 2009 - 21:40 #9
$query er en MySQL-ressource, ikke et array. Brug mysql_fetch_assoc(), hvis du vil gøre det sådan der. En nemmere løsning ville nok være at bruge mysql_result().
Avatar billede simotho Nybegynder
16. december 2009 - 21:51 #10
Det rigtig, havde ikke lige set den fejl.
Prøver det lige :)
Avatar billede simotho Nybegynder
16. december 2009 - 23:19 #11
Har nu prøvet med dette
<?php

          $sql = "SELECT COUNT(*) + 1 AS `number` FROM `users` WHERE `penge` > (SELECT `penge` FROM `users` WHERE `id` = '1')";
         
          $query = mysql_query($sql);
          $antal = mysql_num_rows($query);
          $row = mysql_fetch_assoc($query);

          echo "Du er nr ".$row['number']." ud af ".$antal;

        ?>

Den udskriver
Du er nr 1 ud af 1.
Kan i forklare hvad COUNT(*)og det stykke kode i parantesen gør?

Og evt. hvorfor den ikke udskriver Du er nr 1 ud af 28 (som er antallet af brugere) ?
Avatar billede simotho Nybegynder
17. december 2009 - 07:34 #12
Jeg fik løst det med en anden mysql_num_rows ved siden af :)
Mange tak for hjælpen :)
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