Jump to content
php.lv forumi

Ierakstu kārtošana


andrisp

Recommended Posts

Kā vislabāk nodrošināt lietotājam iespēju izvēlēties ierakstu izdrukāšanas secību (piem., galerijas bildes) ?

 

Viens variants:

 

Varbūt piešķirt katram tabulas ierakstam vērtību 'order', kurš apzīmē kārtas nummuru pēc kā kārtot (Piem., ja ir 5 bildēs, tad 'order' ir no 1 līdz 5). Tad adminēšanas interfeisā katrai bildītei piekabināt klāt divas bultiņas 'uz augšu' un 'uz leju'. Tad, piemēram, ja es nospiežu pogu 'uz augšu' bildei ar 'order' vērtību 4, tad tās 'order' vērtība tiek nomainīta uz 3, bet tās bildes, kura bija visu laiku ar 'order' vērtību 3, vērtību nomainu uz 4. Tad, piemēram, ja es nospiežu pogu 'uz augšu' bildei ar 'order' vērtību 4, tad tās 'order' vērtība tiek nomainīta uz 5, bet tās bildes, kura bija visu laiku ar 'order' vērtību 5, vērtību nomainu uz 4.

 

Pievienojot jaunu ierakstu, 'order' vērtība tiek piešķirta MAX(order)+1.

 

Ieraksti izdrukāti tiktu ar SELECT * FROM gal ORDER BY `order` ASC DESC

 

 

Varbūt ir kāds labāks veids kā to nodrošināt ?

Edited by andrisp
Link to comment
Share on other sites

Nu es piemēram nezinu citu variantu... Vēl var pielikt - `uz sākumu`, `uz beigām`

 

btw, liekas, ka new_order_id = cnt_record būs ātrāk... MAX kā nekā ir salīdzināšanas operācija pa visu tabulu. jātestē...

Link to comment
Share on other sites

Ja lauks ir indeksēts binārā kokā (nezinu īsti kā MySQL indeksus iekšēji uztur), tad MAX operācijai uz šo lauku vajadzētu nostrādat log(n) laikā.

 

andrisp: bet tos order skaitļus tiešām nevajag pēc kārtas. Galvenais lai tie ir unikāli. Pēc abu order skaitļu dabūšanas to apmaiņa jau ir triviāla, pie tam realizējama ar vienu UPDATE.

Link to comment
Share on other sites

idials variants to order skaitljus likt ar kautkaadu soli, teiksim 5 vai 10

5,10,15,20...

 

Liels pluss shaidai pieejai ir tas kad neko iipashi nemainot var iespraust ierakstus pa vidu (protams liidz zinaamai robezai) ...

5, 6,7,10,15,16,20...

utt...

Link to comment
Share on other sites

order lauks IMHO arī ir vispareizākā pieeja un jaunā ieraksta kārtas numurs ir jārēķina tieši ar MAX(order)+1. Ja liks pēc count() vērtības, tad vienā brīdīt tev būs 2 vienādas order vērtības (piem. pieliec vienu bildi, pieliec vēl vienu, tad vienu izdzēs kaut kur no sākuma un, kad liksi nākamo, tad pēdējām 2 būs vienādi order un tas nekam neder).

 

Kārtošana arī nebūs tik sarežģīta - vienk. apmaini blakus stāvoši order lauku vērtības.

 

Un par to iespraušanu vidū - intervāls nav slikti, bet intervāla vienmēr ar laiku izsīks. Vislabāk laikam būtu spraužot pa vidu vienk uztaisīt:

 

UPDATE tabula `order`=`order`+1 WHERE `order` >= vēlamā_pozīcija

#paceļam visu uz augšu no tās vietas, kur gribam iesprausties

Link to comment
Share on other sites

intervāls nav slikti, bet intervāla vienmēr ar laiku izsīks.

slicer --> ??? tu ko?

uzliec BIGINT + UNSIGNED ar intervaalu 100

un vareesii dabuut

184 467 440 737 095 516 ierakstus

ja pienjem ka uz zemeslodiites ir 7 miljardi iedziivotaaju tad katrs varees pievienot

26 352 491 bilzukus ;)

Maz neliekas?

 

Nu ja izmanto INT ar intervalu 100!!

buus 21474836 iespejamo ierakstu

;)

Elementaara matimaatika ;)

 

edit: aprekjini ir aptuveni...

Edited by Grey_Wolf
Link to comment
Share on other sites

nu var dariit taa:

- pievienojot ierakstu, pieskjirt max(skaitiitaajs) + 1

- biidot uz leju/augshu - atrast naakamo/iepreiksheejo un samainiit skaitiiaajus vietaam

bet man nav iisti skaidriibas vai pie lieeeelas slodzes nebuus gljuki (vismaz pie nelielas viss ir ok)

Link to comment
Share on other sites

Es uzrakstīju fju, ar kuras palīdzību var veikt šo kārtošanu. Lai sekmīgi strādātu `order` jābūt integerem signed (lai varētu būt negatīvas vērtības). Vienīgi man tur diezgan daudz sql kveriji, kas varētu būt diezgan lēndarbīgi.

 

Bet, manuprāt, strādā lieliski. :)

 

Šeit varat apskatīt un pakomentēt (par ātrdarbību/uzlabošanu) varbūt -> http://paste.php.lv/4011

 

Izsaukšana notiek arī vienkārši (piem, lai pavirzītu ierakstu ar id = 7 uz augšu):

change_rec_sorting('up', 7, 'unikaalaa_identifiera_kolumnas_nosaukums', 'order_kolumnas_nosaukums', 'tabulas_nosaukums');

 

Pēc Delfina ieteikuma var arī izsakt fju ar 'start' un 'end'.

Link to comment
Share on other sites

Grey wolf - tagad parēķini savam BIGINT, cik atmiņas aizņems tabula un cik aizņems tabulas indekss uz order lauku, jo lai smuki varētu kārtot pēc order lauka, tādam tur būs noteikti jābūt :)

 

BIGINT tādiem mērķiem nav paredzēts.

Link to comment
Share on other sites

Kā jau teicu: samainīt vietām var ar vienu updeitu! Dabūt $order1, $order2, izrēķini $order_sum = $order1+$order2, un tad:

UPDATE table SET order_col = $order_sum - order_col WHERE order_col in ($order1, $order2)

Tad arī vari pie reizes apvienot tos $direction ifus (up/down).

 

BIGINT tādiem mērķiem nav paredzēts.

Muļķības. BIGINT ir tam paredzēts. PostgreSQL btw kā primāro atslēgu auto_incrementu parsti liek int8 (kas ir bigint's mysqlam).

Link to comment
Share on other sites

man labāk patiktu ka var pārcelt ieraksu A aiz ieraksta B, nevis up/down/start/end spaidīt.

Tik kā to noorganizēt ?

Vislabāk jau protams no jūzerfriendlī aspekta būtu ar javascript uztaisīt drag-n-drop iespēju, bet līdz tam man vēl zināšanu pietrūkst.

 

Varētu arī katram ierakstam pretī nolikt drop-down menu, kurā būtu salistoti visi ieraksti, un tad būtu iespēja izvēlēties aiz kura no ierakstiem pārvietot, bet tas nebūtu ērti, it sevišķi fotogalerijas variantā vai ja ierakstu ir daudz.

 

Vēl kādi varianti ?

Edited by andrisp
Link to comment
Share on other sites

×
×
  • Create New...