[php/mysql] volgorde van items in db veranderen

Pagina: 1
Acties:

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
CREATE TABLE `faq_categorieen` (
`id` int(11) unsigned NOT NULL auto_increment,
`naam` tinytext NOT NULL,
`volgorde` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `faq_categorie_order` (`volgorde`)
);

beoogde functionaliteit:

via een webpagina de volgorde van items (opgeslagen in db volgens bovenstaand model) veranderen.

wat heb ik al gedaan:

ik heb al - met bloed, zweet en tranen (javascript is niet mijn sterkste kant; als browsers nou zouden werken zoals ze zouden moeten werken zou dat al een hoop schelen - maar ik dwaal af) - de client side code gemaakt. Klik hier om deze pagina te bekijken (als je op wijzig klikt, zie je de nieuwe volgorde zoals het php-script deze krijgt aangeleverd).

het probleem:

Je kunt nu uiteraard eenvoudig met een lusje de database updaten, maar dan krijg je een UPDATE-query voor elk record en dat vind ik een beetje zonde.
Is er een betere manier (het dbmodel kan eventueel nog aangepast worden, mocht dit nodig zijn)?

Pas de replâtrage, la structure est pourrie.


Verwijderd

zorg dat volgorde ver uit elkaar ligt, bv 1000,2000,3000. dan kan je dingen ertussen voegen. zogauw er geen plaats meer is om tussen te voegen, maar je de volgorde weer 1000,2000,3000 dmv een lusje

[edit]

wat je ook zou kunnen doen:

ja maakt een gelinkte lijst van de records, daardoor kan je makkelijk invoegen.
je kan het veld volgorde dan weghalen, en een nieuw veld: volgende/vorige toevoegen, wat een ref key is naar de volgende/vorige.

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Verwijderd schreef op 31 augustus 2002 @ 18:35:zorg dat volgorde ver uit elkaar ligt, bv 1000,2000,3000. dan kan je dingen ertussen voegen. zogauw er geen plaats meer is om tussen te voegen, maar je de volgorde weer 1000,2000,3000 dmv een lusje
Records toevoegen is geen probleem:
eerst bij alle records met een nummer hoger dan die van de nieuwe 1 bij het veld volgorde optellen, vervolgens je nieuwe record inserten.

Het gaat om het veranderen van de volgorde van alle items in één keer.
ja maakt een gelinkte lijst van de records, daardoor kan je makkelijk invoegen.
je kan het veld volgorde dan weghalen, en een nieuw veld: volgende/vorige toevoegen, wat een ref key is naar de volgende/vorige.
Dat lijkt me niet zo handig, ten eerste omdat invoegen zoals ik al zei niet echt het probleem is, ten tweede omdat het ophalen van alle records in de juiste volgorde dan een niet-triviale opdracht wordt (en bekijken gebeurt veel vaker dan veranderen).

Pas de replâtrage, la structure est pourrie.


Verwijderd

ik denk niet dat je alle records in 1 keer kan wijzigen, omdat je bij een update maar 1 wijziging kan doen. Het lijkt me dat een loop dan de enige oplossing is.

Verwijderd

het kan gewoonweg niet met 1 query. Je moet namelijk elk afzonderlijk record een nieuw positienummer toekennen, dus voor elk record zul je een aparte query moeten uitvoeren (middels een lusje).

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
jammer maar helaas.

ik zal wel de nieuwe volgorde vergelijken met de oude om te voorkomen dat er onnodige queries worden uitgevoerd.

iedereen bedankt voor het meedenken! :)

Pas de replâtrage, la structure est pourrie.


  • ReLight
  • Registratie: Augustus 2001
  • Laatst online: 05-08 21:32

ReLight

echo("What Now ? !")

Ik weet niet precies wat je uiteindelijke doel was van het veranderen van de volgorde, misschien om de laatste veranderde FAQ eerst te tonen ?

Maar stel dat zoiets je doel was, probeer het eens met een timestamp veld, en sorteer je 'ophaal query dan daarop. Een Timestamp veld in MySQL past zich aan automatisch naar time=now op het moment van een update query van dat record (waneer je niet expliciet dat veld aanpast).
Je hebt dus dan dus maar 1 update nodig.

T'is maar mee denken. : 8)

Mijn zoon & dochter zijn de toekomst, de rest is tijdsvermaak. Home assistant & & Nibe S2125-12/SMO-S40, RMU-s40 & Tado - Volvo C40 ER, SE

Pagina: 1