[SQL] positie 1 lager
(id int(11),position int(11),img varchar(255),name varchar(255))
ik wil een rij ertussen verwijderen, dus moeten alle rijen waarvan de positie hoger is dan de rij die verwijderd wordt, met 1 worden verlaagd. Van de rij die verwijderd wordt heb ik de id. Nu wil ik met 1 query de rijen ophogen, zonder eerst de positie v/d rij op te halen, dus ik dacht aan iets zoals:
UPDATE celp_software_os SET position=position-1 WHERE position>(SELECT position FROM celp_software_os WHERE id=8)
Het lijkt mij dat het klopt op het SELECT deel na, wat moet daar komen te staan?
Quote:
ik wil een rij ertussen verwijderen, dus moeten alle rijen waarvan de positie hoger is dan de rij die verwijderd wordt, met 1 worden verlaagd
Dat snap ik niet.
Voorbeeldje:
1
2
3
En nu verwijder ik de waarde 2 en hou ik dus over:
1
3
Dit is dus exact dezelfde volgorde als voorheen, alleen mist er nu 1 record. So what?
Een integer kan een paar miljard waardes bevatten, de kans dat dit een probleem wordt, is bijzonder klein. En mocht het een probleem worden, verkoop je jouw product voor heel veel geld of converteer je de INT naar een BIGINT.
vb:
id | position |
1 | 1
2 | 3
5 | 2
7 | 5
8 | 4
nu verwijder ik een rij (id=5).
dan wil ik dat dat de positie van 3 rijen met 1 wordt verlaagd (id=2,7,8)
zodat het word:
id | position |
1 | 1
2 | 2
7 | 4
8 | 3
Je probeert een probleem op te lossen die er helemaal niet is.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Mijn vraag was, wat de juiste sql-code om mijn 'onhandige' plan te bereiken..
Ik waardeer je commentaar, maar voor ingewikkeldere volgorde veranderingen is het voor mij handiger als de 'relatieve' nummers aansluitend zijn.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
DELETE FROM tabelnaam WHERE positie = 3;
UPDATE
tabelnaam
SET
positie = positie -1
WHERE
positie > 3;
UPDATE
tabelnaam
SET
positie = positie -1
WHERE
positie > 3;
Let er heel goed op dat dit fout gaat wanneer je meerdere records in 1x verwijdert en dat je altijd een update uitvoert nadat je een delete hebt gedaan. De update kun je automatiseren met een trigger, het beperken van de delete tot slechts 1 record, kun je niet afdwingen. De trigger zal dan ook de mist in gaan. En dus ga je hier bewust risico's nemen zonder dat er enige winst tegenover staat.
Quote:
Denk even out of the box en verzin een betere oplossing. Je doet nu aannames (dat bepaalde getallen aanwezig zijn) en deze aannames gaan de mist in wanneer er meer dan 1 concurrent user op jouw database zit.maar voor ingewikkeldere volgorde veranderingen is het voor mij handiger als de 'relatieve' nummers aansluitend zijn.
En een corrupte database is niet handig.
nog 1 dingetje, ik heb alleen de id, niet de positie... dus eerst moet de positie aan de hand v/d id worden bepaald.
Deze query verwijdert het record met id 3 en geeft aan jouw applicatie de oude positie van dit record door. Het resultaat dus even fetchen en gebruiken als input voor de UPDATE.
Met MySQL (en andere databases) heb je een extra SELECT-query nodig die je voor de DELETE uitvoert.
Maar vergeet de trigger niet, die weet ook wat de positie is, zie OLD.positie.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
bedankt voor je tips, ik zal er zeker rekening mee houden als er een positie systeem komt die door meer dan 1 gebruiker gebruikt zal worden. (Dit is voor het admin control panel)...
Gemiste kans.
Gewijzigd op 01/01/1970 01:00:00 door Roel -