Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    129

    salire e scendere nell'ordine

    Ciao a tutti, ho un piccolo problema con l'ordinamento di una classifica di nomi su mysql:

    la tabella ha questa struttura:

    nome utente | classifica
    gianni | 1
    massimo | 2
    luca | 3

    etc...

    come potrei scambiare il valore del campo classifica fra 2 nomi qualsiasi (consecutivi) con una (o più query)?
    vorrei cioè creare un link del tipo "sali in classifica di un posto".

    E' possibile fare ciò senza tanti giri di codice?

  2. #2
    Se la tabella ha solo quei 2 campi (il che sarebbe abbastanza assurdo) allora devi fare almeno tre query. Supponendo di voler far salire luca:

    - assegni a massimo un valore fittizio temporaneo
    - assegni a luca il valore 2
    - assegni a massimo il valore 3

  3. #3
    Lo puoi fare anche con due query, e i dati che devi ricevere sono pochi e di sicura reperibilità.

    Dunque:
    immagina di avere una tabella come questa, in html intendo:
    codice:
    primo utente   [--][down]
    secondo utente [up][down]
    terzo utente   [up][down]
    ...
    N utente       [up][--]
    dove i link sono i seguenti:
    [up]: pagina.php?id=ID&pos=POS&action=up
    [down]: pagina.php?id=ID&pos=POS&action=down
    [--]: nessun link


    Codice PHP:
    #ricevi: pos, id azione
    $id $_GET['id']; # l'id da aggiornare
    $pos $_GET['pos']; # posizione attuale
    $action $_GET['action']; # azione, up, down

    # imposti i paramentri per le query sql
    if($action == 'up') {
        
    $newpos $pos -1;
    } elseif(
    $action == 'down') {
        
    $newpos $pos +1;
    }

    $query_upd "UPDATE tabella SET classifica = '$newpos' WHERE classifica = '$pos' LIMIT 1";
    $query_ord "UPDATE tabella SET classifica = '$pos' WHERE classifica = '$newpos' AND id != '$id' LIMIT 1"
    Ciao!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    129
    grazie mille ragazzi, è quello che cercavo. si è aggiunta una complicazione però, nella classifica c'è la possibilità che uno dei nomi possa essere eliminato. Si creerebbe così un "buco" negli id posizione. Mantenedo il vostro schema sto cercando di risolvere il problema utilizzando il "record" precedente e quello sucessivo al posto del semplice id +-1.

    con una query del tipo:

    select id from tabella where id < x order by id limit 1

    Così facendo rimarrebbero dei "buchi" nella sequenza di ID ma il tutto dovrebbe funzionare, fra l'altro non ho trovato un sistema migliore di questo.

    Che dite è giusto come approccio?

  5. #5
    Ma non c'e' qualche altro dato in base al quale viene calcolata la classifica?

  6. #6
    no...
    se elimini un record, devi fare una query in più.

    Delete:

    Supponiamo che tu con il link passi anche la posizione attuale.
    Esempio: pagina.php?action=delete&id=ID&posizione=POS

    allora fai:
    Codice PHP:
    $query_del "DELETE FROM tabella WHERE id = '$id'"
    $query_ord "UPDATE tabella SET classifica = classifica-1 WHERE classifica > 'POS'"
    Mi pare semplice no?
    Ciao!

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    129
    fmortara, la soluzione è perfetta, ti devo una pizza

    4 stagioni può andar bene?


  8. #8
    ottimo... la 4 stagioni intendo!
    Ciao!

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.