Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [mysql] Ordinare le righe in una tabella con auto increment

    Credo sia una domanda a dir poco banale.
    Comunque, immaginiamo di avere una semplice tabella con auto_increment e di creare tre righe:
    codice:
         id    dato1   dato2
          1      'a'      'b'
          2      'c'      'd'
          3      'e'      'f'
    Se io cancello la riga 2 ottengo questo:
    codice:
         id    dato1   dato2
          1      'a'      'b'
          3      'e'      'f'
    Veniamo al dunque.
    Domanda 1
    Come faccio a ricalcolare tutti gli id in modo da ottenere una cosa del genere?
    codice:
         id    dato1   dato2
          1      'a'      'b'
          2      'e'      'f'
    Domanda 2
    Partendo dall'esempio con tre righe, come faccio a invertire la riga 2 e la riga 3 lasciando però gli id al loro posto?
    codice:
         id    dato1   dato2
          1      'a'      'b'
          2      'e'      'f'
          3      'c'      'd'
    PS: Se c'è qualche scorciatoia con phpmyadmin per ottenere lo stesso risultato mi interesserebbe.

  2. #2
    Utente di HTML.it L'avatar di Gab-81
    Registrato dal
    Nov 2005
    Messaggi
    558
    Che io sappia la domanda 1 ha una semplice risposta: IMPOSSIBILE PHPMyadmin ha un'opzione, Operazioni, che ti permette di dire da che valore può partire l'auto_increment, ma non credo che soddisfi la tua richiesta, perchè genererebbe sempre valori sequenziali e quindi ad un certo punto arriveresti ad un errore, ovvero inserire due tuple con lo stesso ID. Per quel che riguarda la 2° domanda è fattibile, ma devi implementare uno script, tenendo conto di avere uno swap per lo scambio delle tuple...

  3. #3
    :master: Mi chiedo se è una mancanza di mysql o se semplicemente nessun database lo permette...
    Ok, sarà il caso che esponga cosa voglio fare.
    Sapendo l'id di una riga, ad esempio la 3, vorrei accedere con una SELECT alla riga successiva e alla riga precedente
    codice:
    $id=3
    $prec = $id - 1;
    $succ = $id + 1;
    $queryPrec = "SELECT [campi] from [tabella] WHERE id=$prec;";
    $querySucc = "SELECT [campi] from [tabella] WHERE id=$succ;";
    Ma se io ad esempio cancello la riga 2, la query $queryPrec restituirebbe un errore.
    Per evitare ciò sarebbe perfetto un modo per trovare la riga successiva o quella precedente senza passare dall'id, semplicmente utilizzando una referenza alla riga che sono sicuro esista. In parole povere una cosa del genere.
    $queryPrec = "SELECT [campi] from [tabella] WHERE [ riga precedente a quella con id=3 ];";
    Se non è possibile neanche questo mi sparo

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    successivo
    select id from tabella where id > x order by id asc limit 1

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

  5. #5
    Ok grazie.
    Comunque ora avrei una domanda molto simile a quella di prima.
    Immaginiamo sempre di avere la tabella di prima:
    codice:
         id    dato1   dato2
          1      'a'      'b'
          2      'c'      'd'
          3      'e'      'f'
    E se io volessi inserire un valore tra la riga 1 e quella 2? Tipo per ottenere un qualcosa del genere:
    codice:
         id    dato1   dato2
          1      'a'      'b'
          2      'X'      'Y'
          3      'c'      'd'
          4      'e'      'f'
    Con uno script php si può certamente fare, qundi la domanda è: si può fare con un comando sql?

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Non si può fare e non avrebbe molto senso.
    Aggiungi il tuo record in coda e tutt'al più guarda la sintassi di order by field sul manuale per ordinare i record come meglio credi.

  7. #7
    Ma ORDER BY FIELD è un'istruzione a se stante o si può usare solo con SELECT? In ogni caso nei docs di mysql non ho trovato niente, se non qualche accenno
    Comunque se dici che non ha molto senso quello che voglio fare allora devo aver progettato male il database.
    Perciò forse è meglio evitare gli esempi e passare al sodo.

    La tabella che ho fatto io dovrebbe contenere dei testi i quali fanno parte di una guida passo a passo a un linguaggio di programmazione.
    Il fatto che sia passo a passo presume che le righe siano in un ordine NON per ordine di inserimento ma tematico.
    Certo, non avrei problemi inserendo tutte le tappe della guida una dopo l'altra:
    codice:
         id       titolo          testo
          1      'numeri'         '...'
          2      'stringhe'       '...'
          3      'array'           '...'
    Ma cosa succede se dopo aver inserito 10, 20, 30 righe, mi accorgo di essermi scordato di inserire la riga "funzioni che lavorano con le stringhe" ? Questa ovviamente dovrebbe stare vicino alla riga 'stringhe', ma oramani non ci potrei fare niente, apparte ovviamente modificare gli id uno ad uno ( !!! )

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Non necessariamente devi ordinare sull'id autoincrementante. Premesso che non conosco il tuo db potresti comunque inserire un campo di tipo intero e ordinare su quello.


    Esempio
    codice:
    id_autoincrement  categoria_tutorial     ordinamento
    1                              1              1
    2                              2              1
    3                              1              3
    4                              2              2
    5                              1              5
    6                              2              3
    7                              1              4
    8                              2              4
    9                              1              2
    10                             2              5
    Quando vorrai mostrare la guida relativa a qualcosa selezionerai ad esempio i record relativi alla categoria 1 e li ordinerai in base al campo ordinamento, a prescindere quindi dal valore del campo contatore.

  9. #9
    Guardando un pò in giro ho notato che phpBB utilizza una soluzione simile alla tua utilizzando un campo 'order'... In ogni caso io la vedo come una soluzione troppo complicata.
    Alla fine credo che opterò per uno script php che aggiorni gli id di tutte le righe successive e che successivamente richiami il comando ALTER TABLE t ORDER BY f


    Per intenderci una cosa del genere:
    UPDATE table SET id=id+1 WHERE id>numero_riga_da_inserire order by id desc;
    INSERT INTO table (id, ecc...) VALUES(numero_riga_da_inserire, ecc...)
    ALTER TABLE table ORDER BY id

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Non è un'idea saggia quella di andare a modificare gli id di una tabella. Se poi questa fosse relazionata con altre manderesti tutto a meretrici.
    Non vedo cosa ci sia di complicato nella soluzione che ti ho proposto. Poi vedi un pò tu.

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.