Avatar billede invisibleman Nybegynder
04. januar 2002 - 04:44 Der er 17 kommentarer og
2 løsninger

Optimer venligst, PHP+SQL

Er igang med *endnu* et system som E., bare i PHP (personlig udfordring) og for at vise en brugers placering laver jeg et SELECT på alle brugere der har færre eller samme antal point som brugeren selv.

For at undgå at 2+ brugere har samme placering sorterer jeg på både antal point (DESC) og id (ASC) (id vil senere blive udskiftet med et andet felt), trækker alle user id\'s ud og smider dem i et array og bruger array_search() til at give mig brugerens placering i arrayet (+1).

Men jeg synes det lugter lidt af slamkode og er *næsten* sikker på at det hele kan laves i ET SQL med ét udtræk med mysql_result($rs, 0, 0) for at få brugerens placering - I just don\'t know how :-(

Her er det nuværende stykke kode:
------------------------------
$rs = mysql_query(\"SELECT id FROM users WHERE points >= $user_points ORDER BY points DESC, id ASC\") or die(mysql_error());
while ($row = mysql_fetch_row($rs)) $userids[] = $row[0];
$user_rank = array_search($user_id, $userids) + 1;
------------------------------

$user_points indeholder se\'følig brugerens antal point.
Avatar billede invisibleman Nybegynder
04. januar 2002 - 04:46 #1
Jeg bruger by the way, MySQL. Så i tilfælde af at nogle skulle få den *fantastisk* gode idé at bruge sub-selects, så glem det ;o)
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 06:55 #2
Der findes jo DISTINCT som kan bruget til kun at lave et udtræk. dvs. hvis du laver følgende:

SELECT id FROM users DISTINCT ORDER BY points DESC

på denne måde vil du kun få den bruger med flest eller færrest poing afhængingt af DESC

Jeg ved ikke helt om det var det du skulle bruge da dit spørgsmål er lidt kryptisk :)
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 06:56 #3
eller ogsåer det fordi klokken er 7 om morgenen (gaaaaab)
Avatar billede invisibleman Nybegynder
04. januar 2002 - 07:07 #4
Det var ikke det ;o) Mit spørgsmål er nok lidt kryptisk .. dunno ..

okay .. forestil dig jeg har 5 brugere i en tabel:

id  navn          point
1  admin          250
2  invisibleman    300
3  en_anden        300
4  en_tredie      300
5  quadro          302

Jeg vil gerne finde ud af hvilken placering f.eks. \"en_anden\" har. Jeg ved at brugeren har 300 point, og kan derfor udelukke alle der har under det antal.

Med det kan jeg her få af vide at der er 4 brugere der matcher det. Nu sorterer jeg så på point, faldende og dernæst på ID (for at der skal være noget der laver orden i det), stigende.

Nu har jeg så en liste der ser sådan ud:

5  quadro          302
2  invisibleman    300
3  en_anden        300
4  en_tredie      300

men hvordan kan jeg nu vide at \"en_anden\" ligger #3 ?

Det jeg gør nu er, at trække \"id\"\'ere ud og smide dem i et array. Det vil her give mig:

Array (
  [0] => 5,
  [1] => 2,
  [2] => 3,
  [3] => 4
)

nu kan jeg så blot bruger array_search() der giver min indexet på mit id, som her vil være id 3 og index 2.

$index = array_search(3, $mitarray);

$index vil være 2, og da lower bound starter ved 0 lægger jeg en til for at få placeringer fra #1 af.

Resultat: 2 + 1 = Placering #3

Men det jeg vil undgå er min array_search() ..
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 07:32 #5
Ved du ikke hvilket id eller navn du skal lave opslaget udfra?
Avatar billede invisibleman Nybegynder
04. januar 2002 - 07:33 #6
Jo, jo .. jeg har ID\'et på brugeren jeg vil finde placering på ..
Jeg synes jeg har forklaret det rimeligt godt nu .. kan ikke skære det mere ud i pap uden at bruge flere timer på det :o(
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 07:46 #7
SELECT id, COUNT(id) FROM users WHERE points >= $user_points AND id < $user_id ORDER BY points DESC, id ASC

Så skulle dit resultat være:

5  quadro          302
2  invisibleman    300
3  en_anden        300

og $result[1] skulle gerne indeholde 3
Avatar billede invisibleman Nybegynder
04. januar 2002 - 07:51 #8
AND id < $user_id

Hvis brugeren har ID 3, hvordan kan du så få \"quadro\" med der har ID 5 ?
Avatar billede invisibleman Nybegynder
04. januar 2002 - 07:51 #9
Tænkte selv på den der, men kasserede den af ovenstående årsag
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 07:56 #10
jo men begge betingelser skal jo være opfyldt?? ellers bruger man jo OR...
Avatar billede invisibleman Nybegynder
04. januar 2002 - 07:59 #11
Det er lissom også der mit problem ligger, der gør at jeg må bruge den metode jeg pt. gør !

Men nej, AND id < $user_id SKAL ikke være opfyldt ... for en bruger med et højere ID kan sagtens ligge placeret før brugeren jeg vil have placeringen på ..
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 08:07 #12
Ja jeg er åbenbart blind!!! :-)


Jeg ved ikke lige hvordan du så kan lave det udtræk i en\' SQL... men kunne du ikke bare lade brugerene dele 3 pladsen
Avatar billede invisibleman Nybegynder
04. januar 2002 - 08:11 #13
Nix ... der er ingen brugere her på Eksperten der deler placering, ergo skal der heller ikke være det i mit :o)
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 08:17 #14
nej ok... jeg har ikke så meget erfaring med den type udtræk men kunne du måske bruge GROUP BY
Avatar billede invisibleman Nybegynder
04. januar 2002 - 08:18 #15
Eksempel ?
Avatar billede mikkel_robin Nybegynder
04. januar 2002 - 08:24 #16
som sagt jeg har kun meget lidt kendskab til denne type udtræk men der findes et par eksempler her:

http://www.mysql.com/doc/G/r/Group_by_functions.html
Avatar billede erikjacobsen Ekspert
04. januar 2002 - 09:59 #17
Er det ikke bare, hvis man kender den søgtes $userid og $userpoints, dette:

SELECT count(*)+1 FROM users WHERE points > $userpoints or (points=$userpoints AND id < $userid)
Avatar billede invisibleman Nybegynder
04. januar 2002 - 16:35 #18
Hmm .. erik .. prøver om snart ..
Avatar billede invisibleman Nybegynder
27. februar 2002 - 20:18 #19
Jeg stoppede midlertidigt med at arbejde på det projekt hvor jeg skulle bruge dette, så derfor får i begge point.
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