Toon posts:

[MySQL] Row nummers

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een tabel met grofweg de volgende layout:

Tabelnaam "pages"
id int(20) autoincrement
sort int(3)
parent_id int(20)

Alsmede wat velden met inhoud (webpagina's). De "parent_id" is een veldje dat naar NULL of een andere pagina verwijst en geeft de boomstructuur aan. Het "sort" veldje wordt gebruikt om de positie onder een tak (= parent_id) van de boomstructuur aan te geven.
Bij het verschuiven van pagina's moeten de nummers in "sort" worden aangepast, het meest efficiënte is hier om in "sort" alleen even nummers op te nemen; het omhoog schuiven van een pagina is nu een kwestie van sort met 2 verlagen, overige verplaatsingen zijn ook kinderspel geworden; ik hoef me niet druk te maken om omliggende pagina's. Echter moeten alle sort-nummertjes nu weer herschikt worden. Momenteel kost me dat één tussentabel en twee queries maar ik wil het graag in één update-query hebben.

De volgende query lepelt de regelnummers op zoals deze in een update query...

SELECT COUNT(*)*2
FROM pages p1
, pages p2
WHERE p1.sort >= p2.sort
AND p2.parent_id = 1
GROUP BY p1.id
ORDER BY p1.sort

In normale SQL zou ik hier direct een update-query van moeten kunnen maken (eventueel als subselect) maar MySQL 3.x staat me dit niet toe, iemand tips/hints/de oplossing???

Ik weet dat mijn methode enigszins als een omweg klinkt (hoewel het vrij efficiënt is gezien het lage aantal queries dat maximaal nodig is) dus als je een betere manier weet om die sortering te regelen zónder het risico te lopen alle omliggende pagina's in een tak één voor één te moeten hernummeren dan ben ik ook geïnteresseerd.

Verwijderd

Topicstarter
Niemand?
Is het probleem te onduidelijk of te ingewikkeld of is er gewoon geen oplossing voor?
Wat is sowieso de beste manier om sorterings-nummertjes in PHP/MySQL te implementeren, rekening mee houdend dat regels verwisseld/verschoven (willekeurig aantal posities), op willekeurige posities moeten kunnen worden toegevoegd en worden verwijderd???

Verwijderd

Je kan buiten een parent op te geven ook een next en een previous opgeven, zodat je er een linked list van maakt. Daar kan je oneindig in invoegen en verwijderen terwijl de volgorde goed blijft. Je queries worden dan wel wat ingewikkelder.

Verwijderd

Topicstarter
Verwijderd schreef op 19 november 2003 @ 13:34:
Je kan buiten een parent op te geven ook een next en een previous opgeven, zodat je er een linked list van maakt. Daar kan je oneindig in invoegen en verwijderen terwijl de volgorde goed blijft. Je queries worden dan wel wat ingewikkelder.
Dan zou je voor het verwissellen van twee regels dus modaal 4 updates moeten doen(de 2 te verwissellen items en degene er omheen) en een flink aantal selects alsmede wat andere vreemde trucs omdat ik een boomstructuur wil; een parent zou gegevens over de children moeten hebben of je zou NULL's o.i.d. in children moeten gebruiken om begin en einde van de linked list aan te geven. Aangezien in een gemiddelde site vaker de structuur gelezen dan gemuteerd wordt heeft dát onderwerp de hoogste prioriteit qua performance en een linked-list lijkt me dan zeker niet te meest efficiënte keuze.

Het voordeel van de methode zoals ik die nu heb (dus met stappen van 2 en hersorteren na elke verplaatsing) is dat zowel het lezen als het muteren van de structuur zeer efficiënt is. Enige nadeel is dat ik momenteel gedwongen ben om een hulptabel te gebruiken voor het hersorteren. Overigens is hersorteren slechts nodig voor de regels die direct onder een bepaalde tak van de boom vallen.

Zou eventueel het gebruik van een permanente hulptabel iets kunnen helpen? Één voor de inhoud en één voor de structuur bijvoorbeeld???