[MySQL / PHP] Sorteren, maar dan anders

Pagina: 1
Acties:

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Ik wil een lijst records kunnen sorteren, maar dan op een eigen bepaalde methode (dus niet alfabetisch of op volgorde van invoeren). Hiervoor heb ik een colum meegegeven die order_id heet. Hierin staan volgnummers en bij het presenteren kan ik gewoon 'order by order_id' meegeven om de zaak goed wee te geven.

Verder heb ik een App gemaakt waarin die volgorde is aan te passen. Als ik bv. een veld naar boven/voren verplaats, wordt dit (of ZOU dit) bewerksteligd worden door de volgende 2 statements:
PHP:
1
2
3
4
5
6
<?
        $result = mysql_query("update records set order_id=order_id+1".
            " where order_id >= $dnr and order_id < $snr",$db);
        $result = mysql_query("update records set order_id=$dnr".
            " where order_id=$snr",$db);
?>

Waarin $snr het zgn. source-nummer is en $dnr het (je, raad het al) destenation-nummer.

Mijn vraag is dus: kan dat wel op deze manier? Er is een where-clause die iets doet met de order_id, terwijl deze ook wordt aangepast in hetzelfde update-SQL-statement.

Het resultaat is niet wat ik verwacht, overigens, dus ik heb zo'n vermoeden dat er iets niet helemaal pluis is. Iemand enig idee hoe dit te fixen is? Eerst de zaak inlezen en dan terug schrijven?

[ specs ] [ Tweaker gallery ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

In principe moet het kunnen, de "orderid" wordt eerst bekeken en daarna wordt er eventueel wat mee uitgevroten :)

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Op vrijdag 14 september 2001 20:52 schreef ACM het volgende:
In principe moet het kunnen, de "orderid" wordt eerst bekeken en daarna wordt er eventueel wat mee uitgevroten :)
Ja, dat dacht ik ook, net als bij berekeningen ofzo... En toch...

Bovenstaand stukje code levert het volgende resultaat:

$snr = 26
$dnr = 16

Before:

15: Jan-Willem
16: Malon
17: Arthur
18: Simon
19: Nathalie
20: John
21: Mirjam
22: Roeland
22: Hajo
23: Beate
25: Martine
26: Ken

After:

15: Jan-Willem
16: Martine
16: Ken
17: Malon
18: Arthur
19: Simon
20: Nathalie
21: John
22: Mirjam
23: Roeland
23: Hajo
24: Beate

Je ziet: 't wordt een zooitje. Er zijn 2 namen naar voren gezet (Martine en Ken), terwijl alleen Ken naar nr. 16 had moeten gaan. (Vraag me niet hoe ik aan die namen kom :))

[ specs ] [ Tweaker gallery ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ah, je bedoelt het zo :)

Mja, dat is even wat lastiger, dan zal je de tweede check met "orderid = $snr+1" oid moeten doen...

En daar moet je waarschijnlijk wat intelligents omheen bouwen om het altijd werkend te krijgen (soms moet je misschien wel -1 gebruiken ;))

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Hm, dat is het niet... Ik ben er al achter wat er mis gaat. Sneaky hoor. :) Na de eerste PHP-code regel krijg je het volgende resultaat:

15: Jan-Willem
17: Malon
18: Arthur
19: Simon
20: Nathalie
21: John
22: Mirjam
23: Roeland
24: Hajo
25: Beate
26: Martine
26: Ken

Dit klopt dus. Maar je ziet: er staat dus 2x order_id nr. 26. Die worden dan allebij 16. Hm, okay... Misschien iets met 'LIMIT 1' doen bij die tweede code regel. Alleen dan nog even zorgen dat het goede record wordt verplaatst. Right... En zometeen nog het omgekeerde...

[ specs ] [ Tweaker gallery ]


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
't Is een beetje flauw, maar toch - voor de mensen die ooit hetzelfde probleem tegenkomen - hier de oplossing:
PHP:
1
2
3
4
5
6
<?
        $result = mysql_query("update records set order_id=9999 where order_id=$snr",$db);
        $result = mysql_query("update records set order_id=order_id+1".
            " where order_id >= $dnr and order_id < $snr",$db);
        $result = mysql_query("update records set order_id=$dnr where order_id=9999",$db);
?>

9999 is een recorder nummer wat altijd buiten de lijst valt, zo veel zullen het er nooit worden. Eigenlijk best wel een standaard oplossing, huh? :9

[ specs ] [ Tweaker gallery ]


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

set het dan op -1 ipv op 9999 :)

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Op vrijdag 14 september 2001 21:53 schreef wasigh het volgende:
set het dan op -1 ipv op 9999 :)
Die order_id colum was een 'int(5) unsigned', dus dat ging niet. Heb 'm effe signed gemaakt. Ik geef toe: is ook wel weer zo netjes.

[ specs ] [ Tweaker gallery ]

Pagina: 1