Hoofdcategorieën
Topicacties

[PHP/MySQL] Schuiven in volgorde in lijst

Pagina: 1 2 last

Reageer Nieuw Topic
Remember, Remember..

Ik ben bezig met het schrijven van een php klasse die voor mij in combinatie met MySQL een
bedrijvenlijst bijhoudt enb uitleest. Het is belangrijk dat in deze bedrijvenlijst geschoven kan worden van positie (De lijst is gebaseerd op een volgorde in prioriteit). Deze klasse gaat draaien in combinatie met een backend van een website en ik wil hierdoor niet teveel extra load toevoegen.

In de search kwam ik het volgende tegen:
[ASP/SQL] Records schuiven dmv Up/Down knop

Hier gaat het echter om MSSQL en is mij nog steeds niet duidelijk wat het efficienste is.

Nu wil ik met drie buttons (moveUp, moveDown, moveTop) de positie in de lijst kunnen veranderen. Probleem is dan er dan elke keer 2 queries nodig zijn (Update van het unieke ID, Update van alle die groter of kleiner zijn). Als een admin dus 10 keer op die moveUp drukt heb je in een hele korte tijd 20 queries te pakken)

Andere oplossing is clientside met inputs werken waarin de order ingevuld kan worden. Nadeel is dat met een lijst van 50 of 100 bedrijven het vervelend is als je al die nummertjes handmatig moet editen.

Heeft iemand een suggestie of idee?
code:
1
2
3
4
5
6
TABLE company
==============
company_id
name
address
order

Ik zou client side mbv javascript de volgorde bijhouden en het geheel bij een submit pas laten opslaan in de database.

Read the code, write the code, be the code!


Acties: [view][quote]


Door: Janoz
Moderator PRG/SEA
!litemod
Berichten: 16.216
Reg. datum: 19 oktober 2000

Leuk detail : Het in 1x opsturen van een lijst met 100 bedrijven met een volgnummer zorgt natuurlijk ook voor 100 update queries ;)..

Maar verder ben ik met wackmaniac. Gewoon leuk javascript waarmee je de boel op volgorde kunt zetten, en vervolgens een grote save (of submit) knop die de reaultaten in 1x opsturen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Berichten: 7.519
Reg. datum: 12 oktober 2001

quote:
wackmaniac schreef op woensdag 02 mei 2007 @ 13:20:
Ik zou client side mbv javascript de volgorde bijhouden en het geheel bij een submit pas laten opslaan in de database.
Exact wat ik zou doen. Bij een submit de array met bedrijfsnamen / IDs opvangen, dit vergelijken met wat je op het moment in de database hebt staan en zonodig her en der wat updaten.
 
Mijdt subtiliteit

Waarom maak je je druk om een paar update-query's? Stel dat er honderd items in je lijst staan, en het laatste wil je bovenaan hebben, tsja, dan worden er zo'n honderd query's uitgevoerd.

Dat is toch precies waar een database voor gemaakt is? Zo vaak zal die volgorde niet veranderen, tenminste, het lijkt me niet dat de gebruikers van die site continu de lijst zitten te sorteren...

\/ spuit 11 :P

CodeCaster wijzigde dit bericht 02-05-2007 13:26 (3%)

Er is weinig waarvan ik alles weet, maar ik weet van alles wel iets.

getweakt...

Hoevaak verandert iemand nou de volgorde? De database heeft geen enkel probleem met die 2 queries die na iedere request binnenkomen, zolang het aantal bedrijven dat geupdate wordt niet ontzettend groot is en je ook nog veel indices hebt gedefinieerd op het volgorde-veld.

hoi Codecaster :'(

GlowMouse wijzigde dit bericht 02-05-2007 13:26 (6%)

jij ook?

Remember, Remember..

Ben niet zo'n held met javascript. Zou iemand mij een suggestie of tip kunnen doen waar ik naar zou moeten kijken?

Aan de andere kant zou je idd gewoon die update's voor lief kunnen nemen :p

GandalfTheGrey wijzigde dit bericht 02-05-2007 13:27 (25%)

Mijdt subtiliteit

http://tool-man.org/examples/sorting.html

En dan bij het onClick() van de knop ervoor zorgen dat de volgorde (in dit geval gescheiden met pipes ( | )) ge-explodeerd wordt in php, dus onClick="window.location.href='verwerk.php?list='+list.getSequence()" of zo :)

CodeCaster wijzigde dit bericht 02-05-2007 13:31 (18%)

Er is weinig waarvan ik alles weet, maar ik weet van alles wel iets.

Chalet

quote:
GandalfTheGrey schreef op woensdag 02 mei 2007 @ 13:17:
Als een admin dus 10 keer op die moveUp drukt heb je in een hele korte tijd 20 queries te pakken)
Die 20 queries voor een admin actie boeien niet. Wat boeit is dat er 10x geklikt en gewacht moet worden. Als vaak X keer een moveUp/MoveDown actie gedaan moet worden, is het wellicht handig om een interface aan te bieden waarbij je dmv een dropdown het veld kan selecteren waar het huidige record achter moet komen.

Talkin.nl daily photoblog
Day 1376: Chalet
Foto specs: Canon 50D, Tamron 17-50 f/2.8, 1/80s, f/4.5, ISO 100

Berichten: 1.623
Reg. datum: 14 januari 2000

Het is niet helemaal waar dat je dan 100 queries uitvoert. Je bepaalt het beginpunt (bijvoorbeeld positie 6), het eindpunt (bijvoorbeeld positie 5), en je verandert alleen de positie van die items die gelijk aan vijf of groter zijn maar kleiner dan zes door er 1 bij op te tellen. Omgekeerd kan dit ook.

Als je MySQL 5 gebruikt kun je eerst een paar variabelen definieren van de te schuiven rij als je die niet meteen meegeeft vanuit je interface.
sql:
1
UPDATE company SET order = order + 1 WHERE order < 6 AND order >= 5

Je kunt van te voren bepalen met een stukje script wat die integers zijn in deze query. Als je een item helemaal bovenaan zet in plaats van onderaan in een lijst van 200 wordt het dus vanzelf dit:
sql:
1
UPDATE company SET order = order + 1 WHERE order >= 1 AND order > 200

Als je met unique keys werkt moet je even aan de ORDER BY order DESC / ASC denken, anders gaat hij miepen.

Ik fix problemen die volgens de vorige ontwikkelaar in werkelijkheid toch nooit zouden voorkomen.


Acties: [view][quote]


Door: Janoz
Moderator PRG/SEA
!litemod
Berichten: 16.216
Reg. datum: 19 oktober 2000

De twee update queries werken alleen als je maar 1 item verplaatst. Zodra je eigenlijk je hele lijstje om hebt kunnen gooien wordt het een heel stuk lastiger om te bepalen welke queries er allemaal uitgevoerd moeten worden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Berichten: 7.519
Reg. datum: 12 oktober 2001

quote:
Janoz schreef op woensdag 02 mei 2007 @ 14:12:
De twee update queries werken alleen als je maar 1 item verplaatst. Zodra je eigenlijk je hele lijstje om hebt kunnen gooien wordt het een heel stuk lastiger om te bepalen welke queries er allemaal uitgevoerd moeten worden.
Rauw geschreven:
PHP:

1
2
3
4
5
6
7
8
9
<?php
$bedrijvenarray = $_POST['bedrijvenlijst'];

foreach($bedrijvenarray as $bedrijfid->$bedrijfgegevens){

if ($bedrijfgegevens["Rang"] != $databaseobject[$bedrijfid]["Rang"]){
mysql_query("UPDATE...");
}

}
?>

Is in principe goed te doen.
 

Acties: [view][quote]


Door: Janoz
Moderator PRG/SEA
!litemod
Berichten: 16.216
Reg. datum: 19 oktober 2000

Dat zijn niet de type queries uit de post waarop ik reageerde. Wat jij hier weergeeft is juist de fictieve 100 queries waar ik het over had (1 item naar de top verplaatsen zorgt er immers voor dat alle order waardes anders zijn).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Berichten: 7.519
Reg. datum: 12 oktober 2001

Ik reageerde dan ook op het "Zodra je eigenlijk je hele lijstje om hebt kunnen gooien wordt het een heel stuk lastiger om te bepalen welke queries er allemaal uitgevoerd moeten worden." gedeelte, aangezien dat qua code goed te doen is.
 

Acties: [view][quote]


Door: Janoz
Moderator PRG/SEA
!litemod
Berichten: 16.216
Reg. datum: 19 oktober 2000

Dat is allemaal heel leuk en aardig, maar lees nog even de post van Bikkelz waarin hij aangeeft dat het op zijn manier geen 100 queries zouden zijn, waarop ik zeg dat zijn manier erg lastig wordt wanneer er meer items verplaatst zijn. Daaruit verplaats queries afleiden is erg lastig en dan is inderdaad 'de 100 queries' manier die ik eerder aangaf, en die jij nu uitgewerkt hebt, een stuk makkelijker.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Berichten: 7.519
Reg. datum: 12 oktober 2001

quote:
Janoz schreef op woensdag 02 mei 2007 @ 15:33:
Dat is allemaal heel leuk en aardig, maar lees nog even de post van Bikkelz waarin hij aangeeft dat het op zijn manier geen 100 queries zouden zijn, waarop ik zeg dat zijn manier erg lastig wordt wanneer er meer items verplaatst zijn. Daaruit verplaats queries afleiden is erg lastig en dan is inderdaad 'de 100 queries' manier die ik eerder aangaf, en die jij nu uitgewerkt hebt, een stuk makkelijker.
In dat geval kun je ook elke user interactie bijhouden, dat elke keer bij het klikken op "Zet dit bedrijf 1 rang hoger" er aan de array "interactie_geschiedenis" een item toegevoegd wordt.

Bij het submitten van het form vervolgens kijken op welke knoppen er geklikt is, en dit in query's vertalen. Easy peazy :)
 

Acties: [view][quote]


Door: Janoz
Moderator PRG/SEA
!litemod
Berichten: 16.216
Reg. datum: 19 oktober 2000

Tja, en toen was ondertussen al door iemand anders de volgorde aangepast waardoor je uitgaat van een andere beginstand en is het resultaat al helemaal niet wat je verwacht.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Berichten: 1.118
Reg. datum: 24 augustus 2005

In MySQL zou je gebruik kunnen maken van de functie ELT... maar er is in MSSQL volgens mij geen vergelijkbare functie....

als je dan met Javascript al je regels opnieuw geordend hebt, kun je in 1 statement alles updaten:
sql:
1
2
3
4
UPDATE
    company
SET
    order = ELT(order121191081234657)

waarbij de argumenten van ELT zijn: oude ordernummer en daarna op de positie van het oude ordernummer in de argumentenlijst het nieuwe ordernummer... (dus het eerste ordernummer wordt nu op positie 12 geordend, het tweede op positie 11, etc)

maar nogmaals, volgens mij bestaat er geen vergelijkbare functie in MSSQL

overigens zou ik het veld "order" even een andere naam geven... is een reserved word...

P.O. Box wijzigde dit bericht 02-05-2007 15:48 (13%)

 
Remember, Remember..

Bedankt voor de reacties allemaal. Ik heb momenteel de javascript oplossing geimplementeerd met gebruik van ELT statement (perfect!)

Enige probleem is dat de backend alle lijsten in tabelformaat weergeeft. Het gebruik van JavaScript TOOLMAN vereist <LI> items. Dit vloekt dus nogal met de layout van de andere pagina's.
Is er een manier om Tabel Rows als <li> item te gebruiken?

edit:
order inderdaad gerenamed naar priority

GandalfTheGrey wijzigde dit bericht 02-05-2007 16:13 (16%)

Berichten: 1.215
Reg. datum: 21 februari 2001

Ik heb het script van toolman aangepast dat ie ook met tables werkt... als je interesse hebt, laat maar horen, dan kan ik wel een voorbeeldje ergens neerzetten.

PS. Het werkt alleen met tables met een border=0, geen zin om uit te zoeken waarom ;) Naja hij werkt wel, maar dan schuift ie beetje vaag op naar rechts als je vertikaal gaat draggen.... Ow en als laatste: volgens mij werkt ie alleen goed in IE :P

reddevil wijzigde dit bericht 02-05-2007 16:24 (25%)

Vaelaa - Human Warlock 80 @ Sunstrider

Remember, Remember..

Daar zou je me een groot plezier mee doen :) Gebruik zelf ook border=0.
Mijdt subtiliteit

Euh... <li class="order_li">, en die dan in je CSS declareren?

Er is weinig waarvan ik alles weet, maar ik weet van alles wel iets.

Moutarde apres le diner
Berichten: 1.896
Reg. datum: 26 februari 2002

Dit lijkt me nu eindelijk eens zo'n typisch gevalletje waar het overhypte AJAX wél voor een handige interface kan zorgen :) Of is dat wat over de top voor TS?

Religion has no place in public schools the way facts have no place in organized religion

Remember, Remember..

quote:
CodeCaster schreef op woensdag 02 mei 2007 @ 18:11:
Euh... <li class="order_li">, en die dan in je CSS declareren?
Het gaat erom dat ik een lijst heb die er zo uit ziet:
code:
1
2
3
4
5
6
===============================================
# CompanyName   Website     E-mail
1   KPN          kpn.nl     info@kpn.nl
2   Bedrijf X    x-bus.nl   blaat@blaat.nl

========================================

Het enige wat ik wil is dat deze rijen dus onderling kan swappen en dit opslaan.
Weet niet of ik met LI style hetzelfde kan bereiken op een makkelijke manier?

AJAX interface is misschien net iets over de top :p

GandalfTheGrey wijzigde dit bericht 02-05-2007 18:43 (29%)

Berichten: 495
Reg. datum: 02 mei 2006

Je kan natuurlijk ook een wat eenvoudigere versie maken waarbij je bijvoorbeeld twee bedrijven van plaats laat wisselen, of een exacte plek meegeeft waar een bedrijf moet komen te staan. In dit geval heb je slechts 2 update queries, die dus de order value van de twee bedrijven omwisselt.

Het is natuurlijk maar de vraag of dit aan je wensen voldoet, maar in ieder geval weer een alternatief! (lijkt me ook wat meer bruikbaar als je bijvoorbeeld iets van plaats 99 naar 50 wil verplaatsen en je geen gebruik maakt van het eerder voorgestelde javascript voorstel)
 

Pagina: 1 2 last



VNU Media logo Powered by True

© 1998 - 2009 Tweakers.net - Alle rechten voorbehouden - Uw Privacy - Algemene Voorwaarden

Uitgever van: