Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923

    [MySql] Query per classifica con posizionamenti intelligenti

    Scusate per il titolo ma non ho trovato di meglio.
    Vengo subito al dunque. Supponendo di avere una tabella del genere in ordine decrescente per punteggio

    codice:
    squadra punteggio
    squadra1    10
    squadra4     7
    squadra3     7
    squadra2     7
    squadra5     6
    squadra7     6
    squadra6     4
    è possibile ottenere una classifica del tipo

    codice:
    squadra punteggio  posizione
    squadra1    10            1
    squadra4     7            2
    squadra3     7            2
    squadra2     7            2
    squadra5     6            5
    squadra7     6            5
    squadra6     4            7
    Le squadre a pari punti devono avere la stessa posizione ma al variare di punteggio la nuova posizione deve tenere conto del numero di squadre che la precedono.
    Mi sta facendo impazzire.

  2. #2
    ma dai... dovrebbe essere semplice per te... mi pare pure che a volte lo hai suggerito tu stesso ad altri....

    metti un contatore che incrementa solo quando la riga cambia il valore...

    Codice PHP:

    <?php

    $row 
    = array('squadra1' => 10'squadra4' => 7'squadra3' => 7,'squadra2' => 7,
                 
    'squadra5' => 6,'squadra6' => 6,'squadra7' => 4);
    $num 0;
    $pippo1 '';

    echo 
    "Squadra - Punt. Posiz.
    "
    ;

    foreach(
    $row as $key => $value) {

       
    $pippo $value;
     
       if(
    $pippo != $pippo1$num++;
     
       echo 
    "$key - $value - $num 
    "
    ;

       
    $pippo1 $value;     
    }
     
    ?>
    usa il while invece del foreach. $row[0] -$row[1] invece di $key -$value


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Grazie Piero per la risposta. Sì, hai ragione e per il momento avevo risolto col php ma mi ero incaponito nel volerlo risolvere direttamente nella query ma sto facendo disastri. Vada per la soluzione in php e non ci penso più. Ti ringrazio.

  4. #4
    Originariamente inviato da nicola75ss
    Grazie Piero per la risposta. Sì, hai ragione e per il momento avevo risolto col php ma mi ero incaponito nel volerlo risolvere direttamente nella query ma sto facendo disastri. Vada per la soluzione in php e non ci penso più. Ti ringrazio.
    questo sarebbe un classico esempio di "campo con valore calcolato". A volte si e' accennato a questo "valore calcolato" sconsigliato da usare in un db e invece qualcuno, a suo tempo, lo aveva inteso "calcolato" in senso matematico sollevando pure una polemica.

    In pratica e' un valore teorico frutto dell'ordinamento di un campo variabile. Semplicemente assurdo volerlo gestire come campo atomico.

    naturalmente IMHO....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Premesso che non sono sicurissimo di aver compreso il tutto, ovviamente non lo inserirei nel db ma stavo cercando di fare una query usando un paio di variabili seguendo la logica che ho adottato in php.

  6. #6
    Originariamente inviato da nicola75ss
    Premesso che non sono sicurissimo di aver compreso il tutto, ovviamente non lo inserirei nel db ma stavo cercando di fare una query usando un paio di variabili seguendo la logica che ho adottato in php.
    avevo capito che volevi inserirlo nella tabella... come non detto.

    E' comunque semplice anche con la sola query.

    codice:
    set @sc = 1, @val = (select punteggio
                                 from classifica 
                                 order by punteggio desc 
                                 limit 1);
    
    select *,
    if(@val = punteggio, @sc, @sc:=@sc+1) as posizione,
    (@val:=`punteggio`)
    from classifica
    order by punteggio desc;
    e' la stessa logica di prima con php.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da piero.mac
    avevo capito che volevi inserirlo nella tabella... come non detto.
    ah ecco. per quello non capivo il discorso che mi facevi circa i campi calcolati.


    E' comunque semplice anche con la sola query.
    codice:
    set @sc = 1, @val = (select punteggio
                                 from classifica 
                                 order by punteggio desc 
                                 limit 1);
    
    select *,
    if(@val = punteggio, @sc, @sc:=@sc+1) as posizione,
    (@val:=`punteggio`)
    from classifica
    order by punteggio desc;
    e' la stessa logica di prima con php.
    Ti ringrazio molto per le query. Sfruttando i tuoi suggerimenti sono arrivato a questa soluzione
    codice:
    SET @riga = 0, @posizione = 0, @preced = 0;
    SELECT @riga := @riga + 1 AS riga, squadra,
    @posizione := IF(@preced<>punti,@riga,@posizione) AS posizione,
    @preced := punti AS punti
    FROM classifica ORDER BY punti DESC
    perchè come nell'esempio, avendo tre squadre a pari punti al secondo posto, quindi con posizione 2, mi serviva che la squadra immediatamente sotto risultasse non terza ma quinta.
    Grazie come sempre per la tua disponibilità.

  8. #8
    Originariamente inviato da nicola75ss
    ah ecco. per quello non capivo il discorso che mi facevi circa i campi calcolati.




    Ti ringrazio molto per le query. Sfruttando i tuoi suggerimenti sono arrivato a questa soluzione
    codice:
    SET @riga = 0, @posizione = 0, @preced = 0;
    SELECT @riga := @riga + 1 AS riga, squadra,
    @posizione := IF(@preced<>punti,@riga,@posizione) AS posizione,
    @preced := punti AS punti
    FROM classifica ORDER BY punti DESC
    perchè come nell'esempio, avendo tre squadre a pari punti al secondo posto, quindi con posizione 2, mi serviva che la squadra immediatamente sotto risultasse non terza ma quinta.
    Grazie come sempre per la tua disponibilità.
    Buonasera a tutti! Googlando a più non posso sono arrivato su questo forum (non è stato difficile, ogni tot. risultati tornavo fra queste pagine ) e facendo una semplice ricerca ho trovato questa discussione, che fa al caso mio. Sto sviluppando una piccola applicazione web col framework Symfony, utilizzando Propel come ORM e MySQL come database. Anche io, come da discussione sopra, ho una tabella con un punteggio finale e vorrei ordinarla "per bene", evidenziando le posizioni e gli eventuali parimerito. Qualcuno saprebbe darmi qualche dritta per la query con Propel?

  9. #9
    Originariamente inviato da piero.mac
    ma dai... dovrebbe essere semplice per te... mi pare pure che a volte lo hai suggerito tu stesso ad altri....

    metti un contatore che incrementa solo quando la riga cambia il valore...

    Codice PHP:

    <?php

    $row 
    = array('squadra1' => 10'squadra4' => 7'squadra3' => 7,'squadra2' => 7,
                 
    'squadra5' => 6,'squadra6' => 6,'squadra7' => 4);
    $num 0;
    $pippo1 '';

    echo 
    "Squadra - Punt. Posiz.
    "
    ;

    foreach(
    $row as $key => $value) {

       
    $pippo $value;
     
       if(
    $pippo != $pippo1$num++;
     
       echo 
    "$key - $value - $num 
    "
    ;

       
    $pippo1 $value;     
    }
     
    ?>
    usa il while invece del foreach. $row[0] -$row[1] invece di $key -$value

    Sono passato per vedere se qualcuno poteva illuminarmi sul mio post precedente, ma nulla...pasiensssa, vorrà dire che per questa query abbandonerò temporaneamente Propel e tornerò al caro SQL!

    Piuttosto:
    Il listato qui sopra non mi convince a pieno..credo dia come risultato una cosa del genere:
    codice:
    Squadra     Punt. Posiz.
    squadra1      10   1
    squadra4      7     2
    squadra3      7     2
    squadra2      7     2
    squadra5      6     3 
    squadra6      6     3 
    squadra7      4     4
    Invece che
    codice:
    Squadra     Punt. Posiz.
    squadra1      10   1
    squadra4      7     2
    squadra3      7     2
    squadra2      7     2
    squadra5      6     5 
    squadra6      6     5 
    squadra7      4     7
    Qualche idea su come si possa risolvere con un costo minimo?

  10. #10
    Originariamente inviato da classiFICO

    Qualche idea su come si possa risolvere con un costo minimo?
    A parte la considerazione sul riesumare post di tre anni fa .... aggiungi un contatore e controlla il valore precedente. Sulla falsariga dello script riesumato:

    Codice PHP:
    <?php

    $row 
    = array('squadra1' => 10'squadra4' => 7'squadra3' => 7,'squadra2' => 7,
                 
    'squadra5' => 6,'squadra6' => 6,'squadra7' => 4);

    $num 0;
    $pippo1 0;

    echo 
    "Squadra - Punt.- Pos.
    "
    ;

    foreach(
    $row as $key => $value) {
       
       
    $num++;
       
       if(
    $value != $pippo1 ) { 
          
    $num1 $num;  
          echo 
    "$key - $value - $num1 
    "
    ;   }
               elseif (
    $value == $pippo1) {  
                    echo 
    "$key - $value - $num1 
    "
    ;    }
                          else { echo 
    "$key - $value - $num 
    "
    ;   
                                 
    $num1 $num; }    
       
       
    $pippo1 $value;
          
    }

    ?>

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.