Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php] verwijderde nummer opnieuw toekennen

Pagina: 1
Acties:
  • 139 views sinds 30-01-2008

  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
Ok ik ga het proberen uit te leggen.
Ik ben bezig met iets waar ik niet uit kom.

iets met de nummers toekennen aan verenigen wat voor doet niet ter zaken.

ik heb een tabel

vereniging met de waarde
ver_nr
ver_naam
etc

ik hebeen tabel nummers
met de waarde

ver_nr
reeks_van
reeks_tot


vereniging.ver_nr=nummers.ver_nr

De tabel nummer is als volgt gevuld (als voorbeeld)

ver_nr    reeks_van     reeks_tot
1             1                  10     
2             11                 20
3             21                30
4             31                40

Ik kan de verenigigen nu nieuwe nummer toekennen aan de hand van de hoogste waarde in de tabel.
(heb query niet bij de hand maar dat was)
SQL:
1
select sum (max) from reeks_tot as reeksmax

PHP:
1
2
3
4
//aantal nummer mogen verschillend zijn
$aantal nummer = 10 
$begin_van = reeksmax +1 //laatste nummer in de tabel +1
$reeks_tot = $begin_van + $aantalnummer // is het begin waarde van de nummers + het aantal nummer.


stel dat we ver_nr 3 nog 10 nummer willen geven zou het worden

(40+1) + 10 -1

// -1 omdat 41 + 10 , 51 is en ik 10 nummer wil toekennen en dat is
41,42,43,44,45,46,47,48,49,50

dan zou de insert worden
SQL:
1
insert into nummer (ver_nr, reeks_van, reeks_tot) Values (3, 41,50);

en zou het er zo uit zou uit zien

ver_nr    reeks_van     reeks_tot
1             1                  10     
2             11                 20
3             21                30
4             31                40
3             41                50


Maar nu mijn echte vraag

Vereniging 3 wordt verwijderd
dan heb ik in me tabel staan

ver_nr    reeks_van     reeks_tot
1             1                  10     
2             11                 20

4             31                40


als ik nu een nieuwe nummer aan een vereniging wil geven begint die gewoon bij 41 (laatste waarde is 40 + 1 )

maar nu heb ik de nummer 21 -30 over want die zijn niet toegekent aan een vereniging.

Nu wil ik dat die nummer ook opnieuw uitgegeven kunnen worden maar hoe kan dat.

had zelf zoeits in gedachten.
Afbeeldingslocatie: http://xs512.xs.to/xs512/07062/zomoethet.JPG

hoop dat het duidelijk is.
en vooral dat iemand maar hier mee kan helpen :D


//

zelf dat ik ik aan iets in deze takt
(zullen fouten in zitten maar gaat om het idee)
(ik weet dat het met variabelen niet zo werk maar zo is het hopelijk duidelijk uit te leggen)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$a select  min(ver_nr) as min from nummer;
$b select min+1 (ver_nr) as twee from nummer;
$c select reeks_tot from nummer where( $A);
$d select reeks_van from nummer where ($b);

$aantalnummer = xx //aantal nummer dat toegekent wordt

if ($aantalnummer between $C and $D)
{ insert into nummer etc...

}

elseif ($aantalnummer NOT  between $C and $D)

{
$b ver_nr +1 // eventueel oplaten halen uit een hidden text field en dan plus 1 doen
$a ver_nr $ b +2 //of zoeits allebei de waarde worden met 1 verhoogt.
insert into

}

else // als het nergens tussenpast
voeg nieuwe reeks toe


Hij gaat dus eerst controleren tussen 2 waarden (ver_nr a reeks van en ver_nr b reeks_van) of hier het aantal nummer tussen past.
JA - hij voegt ze tussen
nee hij gaat verder zoeken door bij elk ver_nr 1 nummer op te tellen enzovoort.

Maar HOE ? ik wordt van google niet veel wijzer.
ik zit vast op de goede richting maar ben even ontspoort

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Je moet dan gewoon een select blijven doen totdat hij een lege teruggeeft.

Going for adventure, lots of sun and a convertible! | GMT-8


  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
Snakiej schreef op dinsdag 06 februari 2007 @ 22:41:
Je moet dan gewoon een select blijven doen totdat hij een lege teruggeeft.
kan je dat "gewoon" iets toelichten.

denk ik in de goede richting ?

[ Voor 7% gewijzigd door wd200 op 06-02-2007 22:48 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Serieus, je wil geen antwoord op je vraag. Je hebt een relationele DB voor relaties. Voor alles heb je een key nodig en dit geval hang je overal een id aan. Zo'n id betekent verder niets, het is puur een sleutelwaarde. Ga dan niet proberen om elke id optimaal her te gebruiken.
Maak gewoon een nieuwe id aan, want ik beloof je dat je anders van deze werkwijze gaat balen.

Dus: veld id auto_increment maken, gewoon de db automatisch bij een insert de volgende auto_increment waarde toe laten kennen en maak je niet druk om de feitelijke waarde van die id's. :) Scheelt bovendien bakken code. Code welke zeer gevoelig is voor fouten op het moment dat er meer mensen metaan met max++ == crash & burn)
Dus tenzij de waarde van zo'n id echt boeit, niet doen, want de enige reden om het anders te willen is een slecht datamodel. ;)

Dit alles nofi en :> enzo

{signature}


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Als je ID's opnieuw toe wil gaan kennen, dan is dat vragen om problemen. In dat geval kun je gewoon beter een "nietszeggende" autoincrement waarde als key nemen, en een extra veld opnemen voor een nummer waar je zelf meer mee kan en dat je aan kan passen zoveel je wil zonder je database te vern**ken. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • E-Vix
  • Registratie: Juni 2000
  • Laatst online: 22-11 15:55

E-Vix

Nu met sneeuw!

Het lijkt mij niet handig om een andere vereniging het ID van een vereniging te geven die je verwijderd hebt. Heel simpel. Stel je hebt gegevens van die vereniging. Zeg een betaling die nog niet gedaan is ofzo. Je verwijderd die vereniging om de een of andere reden, en je maakt een nieuwe vereniging aan met het zelfde ID. Dan heeft die nieuwe vereniging opeens een betalingsachterstand. Niet handig dus.
Mijn voorkeur gaat uit naar het niet verwijderen van de data uit je tabel, maar naar het markeren van je record als verwijderd. Maak een extra rij aan en geef met die rij aan of die desbetreffende vereniging wel of niet actief is.

Failed opening '/home/users/7942/signature.inc' for inclusion (include_path='.:') in /home/www/got/userstats.php on line 25


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:43
Waarom heeft iedereen het over ID's? Dat doet hier helemaal niet ter zake, het gaat om de reeks_van en reeks_tot kolom. Ik denk dat je het jezelf te moeilijk hebt gemaakt, ik zou een reeks van 1-10 gewoon opslaan als:
code:
1
2
3
4
5
6
7
8
9
10
11
ver   x?
1     1
1     2
1     3
1     4
1     5
1     6
1     7
1     8
1     9
1     10

In je code kan je dan wel bepalen welke "reeks" al dan niet vrij is.

Roomba E5 te koop


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
E-Vix schreef op woensdag 07 februari 2007 @ 13:33:
Het lijkt mij niet handig om een andere vereniging het ID van een vereniging te geven die je verwijderd hebt. Heel simpel. Stel je hebt gegevens van die vereniging. Zeg een betaling die nog niet gedaan is ofzo. Je verwijderd die vereniging om de een of andere reden, en je maakt een nieuwe vereniging aan met het zelfde ID.
Los van het feit dat je uiteindelijk niet op deze manier wil werken (die TS dus wenst) kun je prima ID's hernummeren als je maar zorgt dat je (idd) foreign keys ook mee-hernummerd. Wat jij aangeeft (openstaande betaling die opeens aan de verkeerde organisatie hangt) is dan ook de schuld van degene die hernummerd; je hebt immers niet alles hernummerd ;)
Uiteraard laat je doorgaans je DB je referentiële integriteit bewaken, maar als je gaat hernummeren neem je die taak (als "programmeur") gewoon tijdelijk op je zelf.

Maar, en dat is een ding dat duidelijk is, uiteindelijk wil je inderdaad niet eens hernummeren en gewoon een ID laten voor wat het is; wil je "clubnummers" hergebruiken dan maak je er gewoon een extra (non-key) veld van.

[ Voor 19% gewijzigd door RobIII op 07-02-2007 13:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Als je dit wil... waarom maak je dan geen koppeltabel, want blijkbaar heb je hier te maken met een situatie waarbij vereist is dat een verneiging meerdere ranges kan hebben die niet aaneengesloten zijn, dus:

een tabel met alle mogelijke ranges, (met unieke identifier)
een tabel met de vereniging (met unieke key)
een koppeltabel die de "uitreiking" doet van de ranges aan de verschillende verenigingen.

vervalt een range, dan haal je gewoon een record weg uit de tabel, bij een nieuwe, kan je met een simpele query bekijken welke eerstvolgende range op het moment nog niet in gebruik is

  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
ik weet niet waarom jullie allemaal terug komen op ID maar het ver_nr heeft er echt niks mee te maken.
Het gaat er om dat ik manier zoek om gaten tussen reeks_tot en reeks_van op te vullen.
Reeks_van en Reeks_tot is puur INT zonder sleutel.

Ik wil bv ver_nr 4 extra nummer geven met een script dat ik nu wordt vult die aan achter de laatste reeks_tot waarde,
maar ik wil dat die de lege nummers opvult.
Verwijderd schreef op woensdag 07 februari 2007 @ 13:42:
Als je dit wil... waarom maak je dan geen koppeltabel, want blijkbaar heb je hier te maken met een situatie waarbij vereist is dat een verneiging meerdere ranges kan hebben die niet aaneengesloten zijn, dus:

een tabel met alle mogelijke ranges, (met unieke identifier)
een tabel met de vereniging (met unieke key)
een koppeltabel die de "uitreiking" doet van de ranges aan de verschillende verenigingen.

vervalt een range, dan haal je gewoon een record weg uit de tabel, bij een nieuwe, kan je met een simpele query bekijken welke eerstvolgende range op het moment nog niet in gebruik is
ja maar dan wordt de database toch TE groot.

dan heb je

1 = 1 -1
2 = 1-2
3= 1-3

etc...

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

wd200 schreef op woensdag 07 februari 2007 @ 14:55:
ja maar dan wordt de database toch TE groot.

dan heb je

1 = 1 -1
2 = 1-2
3= 1-3

etc...
een database TE groot? te groot waarvoor? Je database/tabellen op deze manier indelen is juist veel beter, die paar extra records die je daarvoor terug krijgt en dat kleine beetje extra diskspace verdient zich snel terug ;)

Verwijderd

wd200 schreef op woensdag 07 februari 2007 @ 14:55:
ik weet niet waarom jullie allemaal terug komen op ID maar het ver_nr heeft er echt niks mee te maken.
Het gaat er om dat ik manier zoek om gaten tussen reeks_tot en reeks_van op te vullen.
Reeks_van en Reeks_tot is puur INT zonder sleutel.

Ik wil bv ver_nr 4 extra nummer geven met een script dat ik nu wordt vult die aan achter de laatste reeks_tot waarde,
maar ik wil dat die de lege nummers opvult.


[...]


ja maar dan wordt de database toch TE groot.

dan heb je

1 = 1 -1
2 = 1-2
3= 1-3

etc...
Nu ben je me even kwijt...

volgens mij krijg je gewoon

verniging tabel:
1 - vereniging a
2 - vereniging b

reeksen:
1 - 0 - 10
2 - 11 - 20
3 - 21 - 30
4 - 31 - 40

koppel:

1 - 1 (verniging a heeft 0-10)
1 - 3 (verniging a heeft 21-30)
2 - 2 (verniging b heeft 11-20)
2 - 4 (verniging b heeft 31-40)

verwijderen gaat alsvolgt:
1 - 1 (verniging a heeft 0-10)
1 - 3 (verniging a heeft 21-30)
2 - 2 (verniging b heeft 11-20)
2 - 4 (verniging b heeft 31-40)

maar de reeks blijft bestaan, aangezien die nu niet is toegewezen, kan je dus zien dat 2 niet voorkomt in de waardes uit de koppeltabel, deze is nu dus her te gebruiken.

btw... voor het checken van de beschikbare waardes kan je een vrij eenvoudige query bouwen, die de reeds gebruikte waardes uit de koppeltabel wegstreept uit een query van alle IDs uit de reeksentabel. Ben zelf geen SQL kenner om je even een voorbeeld te geven, maar er is vast iemand die die uit zn mouw tovert!

[ Voor 10% gewijzigd door Verwijderd op 07-02-2007 15:36 ]


  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
ja zoals je zegt klinkt logisch.
maar de nummer zijn random.

dus ipv 10 kan ik ook 5 of 8 of 21 of what ever toekennen hoe vang je dat dan af.

  • rig0r
  • Registratie: Juli 2001
  • Laatst online: 11-03 16:08
volgens mij kan je dit beter in .net oplossen

  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
rig0r schreef op woensdag 07 februari 2007 @ 21:26:
volgens mij kan je dit beter in .net oplossen
die optie is er niet :(

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

rig0r schreef op woensdag 07 februari 2007 @ 21:26:
volgens mij kan je dit beter in .net oplossen
kan je dat eens toelichten?

  • OverSoft
  • Registratie: December 2000
  • Laatst online: 13:20
rig0r schreef op woensdag 07 februari 2007 @ 21:26:
volgens mij kan je dit beter in .net oplossen
Wat is dat nou weer voor stom antwoord?
Wat je in .net kan, kan je zeker zo goed/snel, zo niet BETER in php.

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
OverSoft schreef op woensdag 07 februari 2007 @ 23:01:
[...]


Wat is dat nou weer voor stom antwoord?
Wat je in .net kan, kan je zeker zo goed/snel, zo niet BETER in php.
Sommige dingen gaan wel degelijk makkelijker in .net, maar ik geloof dat de TS al aangegeven heeft dat hij PHP wil gebruiken (en dus waarschijnlijk niet een leuke asp.net server heeft draaien) Vind dit een beetje een flame eigenlijk..

Maar back to the TS!

~ Mijn prog blog!


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Wat je IMHOhet beste kan doen is het volgende:
Zoek de gaten in je nummerreeksen. Bepaal of er een gat is dat groot genoeg is om je nieuwe reeks in te plaatsen.

Voor het vinden van een gat kun je loopen over je gehele nummerreeks:
(pseudocode)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
temp.van := 1
temp.tot := <lengte uit te reiken reeks>
vorige.van := (-<lengte uit te reiken reeks>) + 1
vorige.tot := 0
for ( var in nummerreeks (geordend op "van") )
   if temp.tot < var.van and temp.van > vorige.tot then
      # reeks gevonden, stoppen maar
      exit for
   else
      vorige := var
      temp.tot := var.tot + (temp.tot - temp.van) + 1
      temp.van := var.tot + 1
   end if
end for
# temp heeft nu hoe dan ook de juiste waarde


Even uit de losse pols, dus geen garanties met betrekking tot volledige correctheid :)

edit:

Ligt het nu aan mijn Firefox 2.0 of doen code tags het niet helemaal lekker?

[ Voor 5% gewijzigd door bigbeng op 08-02-2007 10:26 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
bigbeng schreef op donderdag 08 februari 2007 @ 10:25:
edit:

Ligt het nu aan mijn Firefox 2.0 of doen code tags het niet helemaal lekker?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
bigbeng schreef op donderdag 08 februari 2007 @ 10:25:
Wat je IMHOhet beste kan doen is het volgende:
Zoek de gaten in je nummerreeksen. Bepaal of er een gat is dat groot genoeg is om je nieuwe reeks in te plaatsen.

Voor het vinden van een gat kun je loopen over je gehele nummerreeks:
(pseudocode)


Even uit de losse pols, dus geen garanties met betrekking tot volledige correctheid :)
Ziet er mooi uit ga ik morgen zeker proberen het is iig wel duidelijk zoiets zocht ik dus:)

Verwijderd

Wat ik even nog wil weten als ik niet te brutaal of te nieuwschierig ben.... wat is het doel van die ranges, ik bedoel, het lijkt nu dat je bang bent dat de verzameling van natuurlijke getallen te weinig is voor jouw ranges... je kan toch gewoon een range uitgeven die aansluit op de hoogste range die reeds is uitgegeven? Of denk ik nu te simpel, volgens mij verhelpt dit een aantal lastige situaties!

  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
Verwijderd schreef op donderdag 08 februari 2007 @ 15:19:
Wat ik even nog wil weten als ik niet te brutaal of te nieuwschierig ben.... wat is het doel van die ranges, ik bedoel, het lijkt nu dat je bang bent dat de verzameling van natuurlijke getallen te weinig is voor jouw ranges... je kan toch gewoon een range uitgeven die aansluit op de hoogste range die reeds is uitgegeven? Of denk ik nu te simpel, volgens mij verhelpt dit een aantal lastige situaties!
Jou idee is goed maar met dat idee kan ik nog geen reeksen Tussen voegen en worden alle ranges aan het einde toegevoegd

Verwijderd

Ja klopt, maar ik vroeg me al af of de verzameling van natuurlijke getallen wellicht niet voldoende is voor jouw doeleinden ;)
edit:
Okee, er is natuurlijk in MySQL een beperking aan het aantal getallen dat je kan gebruiken, maar dat lijkt me als je spreekt over verenigingen toch afdoende??


of heb je een concreet probleem als er "gaten" vallen in de ranges?

[ Voor 30% gewijzigd door Verwijderd op 08-02-2007 16:20 ]


  • Pacjack
  • Registratie: Oktober 2001
  • Laatst online: 10:37
Stel je nou voor dat het nummers van vogelringen zijn en zo'n duif stort neer. 8)7
Dat ringetje wordt in praktijk toch ook niet hergebruikt? Inconsistent.
Tijdens mijn uitwerking van die MBO assessment opdracht heb ik die eis gewoon genegeerd en uitgelegd waarom het raar is om die nummers te herbruiken.

⌘ | deze gebruiker weet waar zijn handdoek is


  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
Pacjack schreef op donderdag 08 februari 2007 @ 16:25:
Stel je nou voor dat het nummers van vogelringen zijn en zo'n duif stort neer. 8)7
Dat ringetje wordt in praktijk toch ook niet hergebruikt? Inconsistent.
Tijdens mijn uitwerking van die MBO assessment opdracht heb ik die eis gewoon genegeerd en uitgelegd waarom het raar is om die nummers te herbruiken.
tja het zijn ook duif nummer :P mbo idd. Volgens mij snappen wij elkaar ;)

maar het is gewoon een kut Niet zo fijne eis :P

//edit ben je toch geslaagd voor het assesment zonder die functie ?

[ Voor 9% gewijzigd door wd200 op 08-02-2007 17:25 ]


  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
ik heb nu viavia een query maar ik snap hem niet :S en volgens mij moet dat echt beter kunnen, kunnen jullie meedenken

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$query = ' insert into ver_ring (ver_nr, reeks_van, reeks_tot)
  select ' . $viu[0] . ', b.begin, b.begin + ' . $ra . ' from 
    (
      SELECT 444  AS begin                                       
      UNION
      SELECT (reeks_tot + 1) AS begin
      FROM ver_ring
    ) AS b
  JOIN
    (
      SELECT 199999999999 AS eind
      UNION
      SELECT reeks_van AS eind
      FROM ver_ring
    ) AS e
  WHERE b.begin <= e.eind
  GROUP BY b.begin
  HAVING (MIN(e.eind) - b.begin) >= ' . $ringaantal . '
  ORDER BY b.begin
  LIMIT 0, 1';

  • wd200
  • Registratie: Juni 2005
  • Laatst online: 11:02
iemand ? die me nog wat tips kan geven

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22-11 22:46

Creepy

Tactical Espionage Splatterer

Eeehh.. hier in PRG gaan we er vanuit dat je zelf je code schrijft of support zoekt bij diegene die de code voor je heeft geschreven. Puur en alleen een query dumpen, zeggen dat je het niet snapt en dat het beter moet kunnen gaat hier echt niet op :)

Ga zelf eens aan de slag met de query en probeer hem te begrijpen. Als je dan nog denkt dat er iets beter zou kunnen en dat krijg je niet zelf voor elkaar dan zou je een nieuw topic kunnen openen. Geef dan wel aan wat er beter zou moeten kunnen en wat je zelf hebt geprobeerd om het beter te maken. Zie ook Programming Beleid en dan met name Programming Beleid - De Quickstart

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.