Newsgroup: it.comp.www.php
Titolo: ordine

Salve a tutti, ecco il il mio obbiettivo:
ho una tabella in un database mysql con ID e altri campi.
Vorrei creare un ordinamento a mia discrezione, cioé, fare in modo che
quando voglio imposto il tal "oggetto" (record) alla tal posizione.
Mi spiego meglio:
stampo a video i miei record ordinati (come in una classifica con
primo, secondo, terzo ecc...). Poi inserisco un record e lo voglio
piazzare alla seconda posizione, ovviamente il vecchio secondo andrà
al terzo posto e così via con  i rimandenti. Poi potrei voler che il
quarto vada in sesta posizione o che venga eliminato.
Quindi il mio problema è implementare il sistema + adatto per
realizzare questo meccanismo. Mi son venutei in mente varie
alternative:
la + ovvia e semplice  è inserire il campo ord con il numero della
posizione. Però a questo punto l'aggiornamento potrebbe diventare
oneroso (bisognerebbe riscrivere tutti i record con posizione/numero +
alta).
Un'altra potrebbe essere quella dell'uso di un puntatore, cioé, un
campo che punti a un ID del record con posizione precedente o
successiva. Ma a questo punto mi incasinerei un po' con
l'ordinamento... cioè, dovrei estrarre tutti i record, ripercorrere la
"strada" tracciata dai puntatori ecc... però avrei in positivo che
l'aggiornamento o l'inserimento richiederebbero poco sforzo sul
database. 
Voi cosa mi consigliereste? Considerando che la posizione non si basa
nè su punteggi nè su alti elementi facilmente interpretabili dalla
macchina.... ma solo da come.. mi gira....
Grazie

 Salve a tutti, ecco il il mio obbiettivo:
La butto li: usi un campo di tipo real e ordini in base a quello.
se hai 1,2 e 1,3 puoi inserire assegnare 1,25 per metterlo in mezzo.
-- 
        C                     F
  per fortuna il mio razzismo non mi fa guardare
          C                        F
  quei programmi demenziali con tribune elettorali

se hai 1,2 e 1,3 puoi inserire assegnare 1,25 per metterlo in mezzo.
Ci avevo pensato anche io...  inserire un elemento facendo la
differenza tra i 2 numeri, dividerla per 2 e aggiungere il risultato.
La tengo in considerazione, ma mi sa che non è proprio l'ottimale... 
Aspetto ancora altre alternative.
Grazie Magilla.
Ciao

L'Ignorante wrote:

IMHO io procederei cosi'..
CREATE TABLE `tab2` (
 `value` INT UNSIGNED NOT NULL ,
 `name` VARCHAR( 255 ) NOT NULL ,
 PRIMARY KEY ( `value` ) 
);
per aggiungere..
BEGIN
SELECT MAX(value) as max FROM tab2
INSERT INTO tab2 (value, name) VALUES ($max, 'nome')
COMMIT
per aggiungere ad una posizione voluta ($new_position)..
BEGIN
UPDATE tab2 SET value = value + 1 WHERE value >= $new_position
INSERT INTO tab2 (value, name) VALUES ($new_position, 'nome')
COMMIT
per eliminare una posizione voluta ($position_to_delete)..
BEGIN
DELETE FROM tab2 WHERE value = $position_to_delete
UPDATE tab2 SET value = value - 1 WHERE value > $position_to_delete
COMMIT
in questo modo avrai una lista facilmente ordinabile..
SELECT * FROM tab2 WHERE 1 ORDER BY value ASC
(l'uso delle transazioni o di un metodo alternativo e' d'obbligo)
poi ci sarebbero altri metodi ma questo penso sia il meno dispendioso in
termini di memoria/prestazioni per il tuo proposito..
fammi sapere..
-- 
www.iuz-lab.info

(l'uso delle transazioni o di un metodo alternativo e' d'obbligo)
Ok, quindi tu sei dell'idea che č meglio tenere una "classifica"
esplicitata dal campo value. Ma se i campi sono tanti (anche se tanto
č relativo) dici che: UPDATE tab2 SET value = value + 1 WHERE value >=
$new_position non č troppo oneroso?

 $new_position non è troppo oneroso?
fai un test..
(2.5639+2.4694+2.4636)/3 secondi su una classifica di 500000 voci (AMD 1.80
Ghz 512MB DDR RAM)
-- 
www.iuz-lab.info