Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    MySql - Posizione in classifica

    Salve

    ho cercato una soluzione al problema posizione in classifica e non ho trovato nulla di meglio rispetto al metodo che sto già usando.

    Ho una tabella nominativi e per ciascuno un punteggio, quello che mi serve è sapere che Pippo, nella classifica, è in posizione 152.

    Nome Punti
    Alberto 850
    Antonio 523
    Cosimo 750
    Corrado 1123
    ''
    ''
    ''
    ''
    ''
    Zaccaria 23

    Il metodo che sto usando, con PHP, è banale e penso dispendioso, in pratica eseguo un select con order Desc sul punteggio e ciclo contando fino a quando scopro che Zaccaria è in posizione 1000.

    Prevedo una tabella con alcune migliaia di nomi... esiste un metodo ottimizzato per risalire alla posizione di qualsiasi persona, in base alla classifica, senza scorrerli tutti?

    Grazie per eventuali suggerimenti

  2. #2
    Utente di HTML.it L'avatar di Leoz83
    Registrato dal
    Feb 2004
    residenza
    Brindisi
    Messaggi
    39
    Ciao, se ne devi tirare fuori solo uno, potresti venirne fuori con un count della tabella classifica per contare quanti elementi ci sono, e fare un altra query ordinando i risultati per punti (desc) limitando il risultato a quel determinato posto, sapendo quanti record totali hai.

  3. #3
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    codice:
    SELECT @posizione:=@posizione+1 as posizione,n.* FROM nominativi n,(SELECT @posizione:=0) inutile order by qualcosa...

  4. #4
    N.B. In risposta a Leoz83 senza aver letto il suggerimento di MySql


    Ciao e grazie per la risposta anche se applicata al mio caso non si discosta molto dalla mia.

    Do qualche dettaglio in più che forse ho tralasciato prima.

    Esiste una sola tabella contenente nomi (unici) e a ciascuno viene abbinato un punteggio cha varia in continuazione.

    La ricerca viene fatta sul nome, in pratica ogni utente tramite interrogazione deve ricevere l'informazione della sua posizione nella classifica in quel momento.

    Tornando al tuo suggerimento, eseguo il count della tabella classifica (= totale nominativi) e quindi non serve a limitare la seconda query.

    Di per sè il problema non è complicato... chiedo solo se esiste un'alternativa alla lettura sequenziale fino al nome interessato (quella che abbiamo definito seconda query).

    Non so se sono riuscito a spiegarmi?

  5. #5
    Ciao,

    se ho capito il tuo problema dovresti risolvere cosi :

    codice:
    SELECT    nome, @curRank := @curRank + 1 AS rank
    FROM     tabella, (SELECT @curRank := 0) r
    where condizione che vuoi tu
    ORDER BY  punteggio;
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  6. #6
    Quote Originariamente inviata da bomberdini Visualizza il messaggio
    Ciao,

    se ho capito il tuo problema dovresti risolvere cosi :

    codice:
    SELECT    nome, @curRank := @curRank + 1 AS rank
    FROM     tabella, (SELECT @curRank := 0) r
    where condizione che vuoi tu
    ORDER BY  punteggio;
    Ciao è grazie per la risposta... è quello di cui ho bisogno ma sembra non funzionare

    allego immagine Html04.jpg

    mi sembra di aver adattato correttamente il tuo esempio ma il risultato è sempre 1

  7. #7
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Mostra la posizione della chiave 40093 (attenzione a fare la ricerca su chiave).
    Quindi non cercare nome='tizio', bensì devi cercare su una chiave (per avere UN risultato)

    codice:
    SELECT if (ser=40093,@posizione+1,null) as sonoio,@posizione:=@posizione+1 as posizione,n.* FROM test n,(SELECT @posizione:=0) inutile order by sonoio desc limit 1
    Mostra chi è il 20esimo
    codice:
    SELECT if (@posizione+1=20,'trovato',null) as sonoio,@posizione:=@posizione+1 as posizione,n.* FROM test n,(SELECT @posizione:=0) inutile order by sonoio desc limit 1

  8. #8
    L'esempio che ti e' stato postato funziona se estrai tutta la classifica, se vuoi estrarre solo una persona e sapere la sua posizione puoi semplicemente fare una query che conta quante persone hanno un punteggio minore di quello della persona in questione.

  9. #9
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Nessuno vuol proprio ragionare sulla mia risposta, eh?

  10. #10
    Quote Originariamente inviata da k.b Visualizza il messaggio
    L'esempio che ti e' stato postato funziona se estrai tutta la classifica, se vuoi estrarre solo una persona e sapere la sua posizione puoi semplicemente fare una query che conta quante persone hanno un punteggio minore di quello della persona in questione.
    Grazie il suggerimento è buono, sicuramente funzionante e alla mia portata.
    P.S. Lavorando all'U.C.A.S non ci avevo pensato...


    Quote Originariamente inviata da MySQL Visualizza il messaggio
    Nessuno vuol proprio ragionare sulla mia risposta, eh?
    Ci ho provato ma non riesco a farlo funzionare...

    Mi da come risultato sempre e solo il primo in classifica ma... dipende dai miei limiti.

    Ringrazio tutti, la via più semplice (alla mia portata) è quella suggerita da k.b

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.