Datuve :: Forums :: Arhīvs :: Datubāzes ierakstu kārošana

Datuve

Mana Datuve

Reģistrācija | Noteikumi | Paroles atjaunošana



Forums

Ieskaties


Raksti

Lietotāji online

Lietotāji online: 98

Reģistrētie lietotāji online: 0

Viesi online: 98

Datuve.lv video
Top.LV

Datubāzes ierakstu kārošana

Ievietoja: Rxx @ 2009.01.11 23:00  

Sveicināti, kolēģi!

Projektēju CMS un esmu atdūries pret šādu jautājumu, vajag iespēju rakstu kategorijas bīdīt uz augšu un uz leju, t.i. mainīt to kārtību. Jautājums - kā atzīmēt šo kārtību datubāzē.

Viens variants būtu attiecīgās apakškategorijas ierakstiem vienkārši piešķirt numurus 1, 2, 3... un pie pārvietošanas tos attiecīgi rediģēt, lai šī kārtība visu laiku saglabātos korekta. Bet, manuprāt, tur sanāk gari kveriji un baigā čakarēšanās. Varbūt ir kāds vienkāršāks variants? Negribas no jauna divriteni izgudrot.

Paldies!

Komentāri:

#1 mefisto @ 2009.01.11 23:04

Varbūt nesapratu problemu, bet kāpēc tu nevari rakstu tabulu veidot ar

create table bļum( id int, sort_id int, title char(255), content text)

#2 Rxx @ 2009.01.11 23:07

Jā, jā, jā.. Tā arī tiek darīts.

Bet tad to sort_id vnk liekt 1, 2, 3 un tā tālāk un tad pozīcijas maiņas gadījumā izomanīt to sort_id gan pārvietotai kategorijai, gan visām pārējām, kas ir pēc tās, ja? Nu tā sanāk..

Vienkārši mana doma ir tāda, iedomājies, ir 50 kategorijas. Un es kādu no 50. vietas, pārceļu uz trešo. Sanāk, ka tad visām kategorijām ar sort_id 3 - 49, tas sort_id ir jāpalielina par 1, baigi daudz to cilpu tur sanāk..

#3 mefisto @ 2009.01.11 23:11

Tā jau gan nesanāk.
Neatkarīgi vai tu maini 'uz augšu, uz leju' vai izmanto 'drag-n-drop'.
Katrā gadījumā tu ietekmē tikai divus tabulas ierakstus. Tev vajag tikai apmainīt sort_id vērtības.

#4 Rxx @ 2009.01.11 23:22

Sanāk gan, manā piemērā  3. un 50. nesmainās vietām... Ja samainītos vietām, tad jau būtu easy... Var jau arī cik tur tās reizes mainīt kategorijas vietām, kamēr viņa ir īstajā vietā, bet tas nav ērti, turklāt tāds risinājums neder, ja vajag pārcelt uz citu virskaegoriju..

#5 mefisto @ 2009.01.11 23:38

Nu bļins.
Šitas ir drausmīgi vienkārši izskaidojams uz papīra, bet grūti aprakstīt forumā.

Ja tu pārvieto X uz Y'ko vietu

UPDATE bļum SET sort_id = sort_id + 1 WHERE sort_d < Y.sort_id AND sort_id > X.sort_id

(šitas ir pareiz ja X.sort_id > Y.sort_id)
Un tad tev tikai atliek uztaisīt UPDATE query'u priekš jaunā X_new.sort_id.
Kopā 3 query'i, neatkarīgi no kategoriju skatu, ja tu nemaini X.level , 4tri queryi, ja tu maini X.level.

#6 moa @ 2009.01.15 03:43

Kas tur grūts:)
Jāsaprot ir, ka jāmaina tikai sort_id vērtības, pārējo jau tā pat selekts paveiks un par to galvu nav lauzīt vērts:)

#7 karuuzo @ 2009.01.15 10:23

Nu bļin, uztaisījuši zinātnisko diskusiju par divriteni :D

Ja tev ir nepieciešamība mainīt secību, likt pa vidu rakstus, utt, izmanto numerāciju ar caurumiem, piem.:
1000, 2000, 3000, ...
Ja tev vajag to pašu 50. pārlikt uz 3, tad tev vienkārši būs viņai jāuzliek 2500 un viss.

m

#8 .... @ 2009.01.15 10:34

Tā gan kā iesaka #7 nedari. :)
Jo ja tu vēlāk vēl kaut ko gribēsi pārlikt uz 3, būs jāpārbauda vai 2500 jau neeksistē, ja eksistē, tad jāmeklē vai 2250 neeksistē, ja eksistē, tad 2125, līdz kamēr nonāks pie tā, ka visi iespējamie caurumi jau eksistē un tā vai tā jāizmanto algoritms, ko mefisto ieteica. :)

#9 karuuzo @ 2009.01.15 13:55

#8: nu, nu. Tā dara jau sen un ielikt pozīcijā ir ļoti vienkārši. ja tev vajag ielikt 3. piozīcijā, paņem 2. + ((3. - 2.) / 2) un neko nevajag pārbaudīt. Līdz zināmai robežai, protams ;)

m