[ Milos911 @ 06.10.2009. 23:14 ] @
Code:

1.Milosh
2.Djura
3.Pera
4.Zika

Imam ove redove u bazi. Zelim da dozvolim korisnicima da ih sortiraju kako oni hoce. Znaci da ako im se svidi stave da ide 1342, pa posle da promene u 4213. E sad ne pada mi kako izvedem ovo. Najveci problem je to sto bih morao da menjam brojeve koji oznacavaju poziciju reda svaki put kad se dogodi neka promena. Napr ako korisnik zeli da red broj 20 stavi na prvo mesto ja bih ostalih 19 morao da promenim. Imate li neku ideju kako bih ovo mogao da izbegnem. Meni nista ne pada na pamet :(
[ Goran Rakić @ 06.10.2009. 23:53 ] @
Dodaj numerički primarni ključ (najbolje automatski brojač) i čuvaj posebno vrednosti, a posebno poredak. Npr:

Tabela `podaci`:
Code:

id   ime
1    Miloš
2    Đura
4    Žika
5    Pera
6    Mika
...


PK je id.

Tabela `poredak`:
Code:

korisnik_id   mesto   podaci_id
...
322           1       5
322           2       1
323           1       1
323           2       4
323           3       2
...


PK tabele poredak je (korisnik_id, mesto).
FK su korisnik_id (nad nekom tabelom korisnika) i podaci_id (nad tabelom podaci). Oba treba da brišu unos kada se referencijalni unos obriše ili promeni.

Odgovarajući poredak za korisnika 323 onda lako dobijaš sa:
Code:

SELECT *
FROM podaci
LEFT JOIN (
  SELECT *
  FROM poredak
  WHERE korisnik_id = 323
) AS poredak ON ( podaci.id = poredak.podaci_id )
ORDER BY poredak.mesto ASC , podaci.id ASC


Nove vrednosti ili kada korisnik nije odredio poredak pojavljuju se na vrhu pre svih u redosledu kolone id u tabeli podaci. Ako ti trebaju na kraju, upit se lako promeni. Možeš da dodaješ i uklanjaš unose iz podaci jer ti PK garantuje vezu sa poredak.

Primer rezultata:
Code:

5   Pera   NULL   NULL   NULL
6   Mika   NULL   NULL   NULL
1   Miloš  323    1      1
4   Žika   323    2      4
2   Đura   323    3      2


Ne isključujem da postoji i bolje rešenje.
[ Milos911 @ 07.10.2009. 10:44 ] @
Hvala na trudu i opsirnom odgovoru :) Lose sam se izrazio gore kad sam rekao da zelim da omogucim korisnicima skripte to i to. Ovo nije visekorisnicka aplikacija vec xhtml wysiwyg editor.
Citat:

Nove vrednosti ili kada korisnik nije odredio poredak pojavljuju se na vrhu pre svih u redosledu kolone id u tabeli podaci. Ako ti trebaju na kraju, upit se lako promeni. Možeš da dodaješ i uklanjaš unose iz podaci jer ti PK garantuje vezu sa poredak.

A sta ako mi trebaju jedno mesto iznad trenutnog :) Ne bih im dozvolio da sami upisuju pozicniju, neko kad prvi put dodaju link napr on se automatski doda na dno. Pa onda imaju dugme za gore, i dugme za dole.
Da napomenem da ako imas (ili ako neko drugi ima) neku ideju, ne mora da se muci da pise kod. Dovoljna mi je samo ideja kako to moze da se uradi, kod cu ja lako napisati...
Hvala ti jos jednom :)
[ Goran Rakić @ 07.10.2009. 10:55 ] @
Ne razumem tvoje podpitanje, ako dodaš novi unos u `podaci` on će se pojaviti u rezultatu u redosledu vrednosti svog id polja. Ako korisnik doda i neki poredak, onda to ima prioritet. Polje `korisnik_id` lako možeš da izbaciš, ili u tvom slučaju zameniš sa `sajt_id`, `strana_id`,...
[ Milos911 @ 10.10.2009. 12:35 ] @
Ok sad sam razumeo ono sto mi nije bilo jasno. Nikad nisam koristio AS,ON, LEFT JOIN, pa mi nesto nije bilo jasno, ali sad jeste (posle 2h experimentisanja :D)
Hvala jos jednom