andrisp Posted June 28, 2006 Report Share Posted June 28, 2006 (edited) 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 June 28, 2006 by andrisp Link to comment Share on other sites More sharing options...
bubu Posted June 28, 2006 Report Share Posted June 28, 2006 Esmu darījis tieši tā kā uzrakstīji. Nav ne vainas. Pameklē forumā - par šo jau runāts ar gataviem skripta gabaliem. Link to comment Share on other sites More sharing options...
Delfins Posted June 28, 2006 Report Share Posted June 28, 2006 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 More sharing options...
bubu Posted June 28, 2006 Report Share Posted June 28, 2006 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 More sharing options...
Grey_Wolf Posted June 28, 2006 Report Share Posted June 28, 2006 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 More sharing options...
slicer Posted June 29, 2006 Report Share Posted June 29, 2006 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 More sharing options...
Grey_Wolf Posted June 29, 2006 Report Share Posted June 29, 2006 (edited) 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 June 29, 2006 by Grey_Wolf Link to comment Share on other sites More sharing options...
KAC Posted June 29, 2006 Report Share Posted June 29, 2006 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 More sharing options...
andrisp Posted June 29, 2006 Author Report Share Posted June 29, 2006 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 More sharing options...
slicer Posted June 29, 2006 Report Share Posted June 29, 2006 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 More sharing options...
bubu Posted June 29, 2006 Report Share Posted June 29, 2006 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 More sharing options...
v3rb0 Posted June 29, 2006 Report Share Posted June 29, 2006 man labāk patiktu ka var pārcelt ieraksu A aiz ieraksta B, nevis up/down/start/end spaidīt. Link to comment Share on other sites More sharing options...
slicer Posted June 29, 2006 Report Share Posted June 29, 2006 Nu ja tik ļoti daudz ierakstu paredzēts, tad variants ar intervāliem strādās protams labāk un ātrāk, bet mazai, tabulai IMHO tas ir neefektīvi. Nu manis pēc... Link to comment Share on other sites More sharing options...
andrisp Posted June 29, 2006 Author Report Share Posted June 29, 2006 (edited) 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 June 29, 2006 by andrisp Link to comment Share on other sites More sharing options...
v3rb0 Posted June 29, 2006 Report Share Posted June 29, 2006 'starpformu'.. uzspied linku 'pārcelt šito', parādās viss saraksts bez tā itema kuru gribi pārcelt, uzspied uz kādu itemu no saraksta, izvēlētais items pārceļas. Link to comment Share on other sites More sharing options...
Recommended Posts