Il drag and drop linkato da telegio consente di variare manualmente l'ordine delle righe di una tabella ma non risolve il problema nel caso dell'inserimento di un nuovo record con campo ordine=1, in tal caso si creerebbe un duplicato.

io mi sono creato una classe PHP (che sto ancora sistemando visto che non è così intuitiva da utilizzare) che mi permette di ordinare arbitrariamente i dati di qualunque tabella, mantenendo l'ordine corretto anche in casi di delete, update o insert.
In pratica non solo permette di spostare la posizione dei record tra loro tramite comode freccette, ma riaggiorna anche correttamente l'ordine sequenziale quando un record viene cancellato o quando ne viene inserito uno nuovo.
Posto il codice utilizzato, se qualcuno è interessato si potrebbe provare a migliorarlo.
Codice PHP:
class CustomOrder {

    public function 
balancePosition($action$table$primarykey$whereclause='') {
    
        switch (
$action) {
    
              case 
'add':        
                 
$counter 2;
                 break;
     
              case 
'clean':
                 
$counter 1;
                 break;
                
        }        
        
        
$sql             "SELECT ".$primarykey." FROM ".$table.$this->setWhereClause(1$whereclause)." ORDER BY position";    
        
$result         mysql_query($sql);

        while(
$row mysql_fetch_array($result)) {
            
$usql             "UPDATE ".$table." SET position='".$counter."' WHERE ".$primarykey."='$row[$primarykey]'".$this->setWhereClause(2$whereclause)."";
            
$uresult         mysql_query($usql);
            
$counter++;
        }

    }    
    
    public function 
movePosition($direction$position$table$whereclause='') {

        switch (
$direction) {
    
              case 
'up':        
                 
$swap = ($position 1) ? $position-- : 1;
                 break;
     
              case 
'down':
                 
$sql     "SELECT count(*) FROM ".$table.$this->setWhereClause(1$whereclause);
                
$result mysql_query($sql);
                 
$row    mysql_fetch_row($result);
                 
$max     $row[0];
                 
$swap     = ($position $max) ? $position++ : $max;
                 break;

              default:
                 
$swap $position;
           }
    
           
$sql "UPDATE ".$table." SET position = CASE position WHEN ".$position." THEN ".$swap." WHEN ".$swap." THEN ".$position." END WHERE position IN (".$position.", ".$swap.")".$this->setWhereClause(2$whereclause);
        
$result mysql_query($sql);
   
}

    private function 
setWhereClause($type$whereclause) {
        
        if (
$whereclause!='') {
        
            switch (
$type) {
    
                case 
1:
                    
$whereclause    " WHERE ".$whereclause;
                    break;
                
                case 
2:
                    
$whereclause  " AND ".$whereclause;
                    break;
                    
            }
        }
        
        return 
$whereclause;
    
    }