Avatar billede leshrac Nybegynder
11. februar 2009 - 10:02 Der er 5 kommentarer og
1 løsning

Query som bestemmer en "rang"

Jeg har en database med en masse brugere... hver brugere har en antal point... jeg tager bruger X han har 13000 point, 38 brugere har flere point end ham...

Jeg skal lave en query, som beregner at han er nummer 38? Uden overheads og brug af whileloops som bare skyder på serveren :)

Mvh
John
Avatar billede psychopixi Nybegynder
11. februar 2009 - 12:22 #1
Du kan løse problemet med subqueries:

<?php
$username = "BRUGER_NAVN";
mysql_query("SET @row = 0");
$result = mysql_query("SELECT * FROM (SELECT @row := @row + 1 AS Row, user AS User FROM users ORDER BY point DESC) AS point_table WHERE User = '$username'");
$r=mysql_fetch_array($result);
echo "User: $username<br/>Rang: " . $r["Row"] . "<br/>";
?>

For mere info se: http://forums.mysql.com/read.php?10,36490,36511#msg-36511

Husk i øvrigt at du er nødt til at nulstille counteren hver gang du skal lave kaldet, da den ellers bare vil fortsætte med at tælle opad. Dvs. at du er nødt til at kalde mysql_query("SET @row = 0") inden du kalder $result = mysql_query("SELECT * FROM (SELECT @row := @row + 1 AS Row, user AS User FROM users ORDER BY point DESC) AS point_table WHERE User = '$username'") hver gang!

Lige en note: Jeg har testet denne metode på en database med 20 brugere med tilfældige point. Det kan være du er nødt til at videre udvikle koceptet for at tage højde for to brugere der har samme antal point.
Avatar billede psychopixi Nybegynder
11. februar 2009 - 12:24 #2
Lige en note til linket ovenfor: du er åbenbart nødt til at kopiere det ind selv, da eksperten åbenbart deler linket op ved kommaer...
Avatar billede leshrac Nybegynder
11. februar 2009 - 13:08 #3
Mange tak for svaret :)

Egentlig sparer det ikke serverecourser... Den looper vel i querien i stedet for.. :)? og bruger dermed samme kapacitet.. så vidt jeg kan forstå...?

Men så absolut kodemæssigt meget flottere end min første tanke som var et relativt grimt loop den skulle hakke sig igennem...

Jeg søgte lidt efter om MySQL havde en eller anden smart funktion som kunne counte selv...

Men du løste mit problem, og jeg bruger din løsning PT :)

Tak for svaret :)

Mvh
John
Avatar billede psychopixi Nybegynder
11. februar 2009 - 13:13 #4
Ja den looper stadig. Du kan ikke programmeringsmæssigt lave en tæller, med mindre du rent faktisk tager fat i det du gerne vil tælle:)

Glad for at du kunne bruge svaret:)
Avatar billede arne_v Ekspert
12. februar 2009 - 02:08 #5
Hvis du kun vil have placeringen af en enkelt bruger må det være nemmere at lave:

SELECT COUNT(*) FROM brugere WHERE point > (SELECT point FROM brugere WHERE id = X)

Den har en lidt anden semantik i situationer med flere med samme antal point, men ikke nødvendigvis mindre rigtig.
Avatar billede leshrac Nybegynder
15. februar 2009 - 18:50 #6
Kan godt se idéen med din version arne_v :) Jeg kigger lidt på den også... tak for tippet ;)
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
Computerworld tilbyder specialiserede kurser i database-management

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