Non sapendo come hai organizzato le tue tabelle assumo che i link preferiti siano in una tabella nella quale sono presenti almeno i campi:
id_link (primario autoincrementante)
id_utente (utente a cui fa capo questo link preferito)
url (url del link)
descrizione (titolo del link)
id_argomento (id dell'argomento di riferimento)
Naturalmente (url e id_utente sono univoci)
Io aggiungo un campo intero "peso".
Quando aggiungi un nuovo preferito di 'pippo', peso è pari al risultato di
select max(peso) from preferiti where id_utente='pippo'
incrementato di 1.
Quando li visualizzi usi
select * from preferiti where id_utente='pippo' order by peso
Per farli "salire" (e quindi perdere peso) ti crei una visualizzazione in cui a fianco ai link metti un'icona che ti passa l'id quel link.
Quando uno fa click supponiamo sul link che ha id=5 un tu script lo riceverà in GET, quindi occorre risalire al link precedente (di peso) a quello scelto e scambiare il suo peso con quello di 5.
Es
select peso from preferiti where id_link=5
//ottengo il peso del nostro link es: 20
select id_link,peso from preferiti where peso<20 order by peso desc limit 1
//cerco il link precedente (evitando rischi di "buchi") in peso es: 15 ,7
Quindi ora so che
id=5 ha peso 20
id=15 ha peso 7
update preferiti set peso=7 where id_link=5
// assegno il peso di 15 a 5
update preferiti set peso=20 where id_link=15
// assegno il peso di 5 a 15
scambiando quindi il peso di un link con il suo precedente.
So che non è chiaro, ma prova a pensarci

Rispondi quotando