Zoeken naar eerstvolgend id nr.
- volgnummer
- nieuwsbriefnummer
Nu heb ik een lijst met deze gegevens zichtbaar. En wil daar eens systeem bij maken dat je bij elke regel een up/down knopje hebt. Als je het knopje indrukt geeft deze het volgnummer van deze regel door. Bijvoorbeeld omhoog. Daarna moet ik in de tabel kijken naar de dichtstbijzijnde rij met het zelfde nieuwsbriefnummer. Ofwel ik heb volgnummer 5, volgnummer 6 bestaat niet en 7 wel. dan pakt hij nummer 7.
Dit kan natuurlijk door het uiterste nummer op te halen dat in de tabel staat een een loop te maken of elk nummer bestaat, en wanneer hij er een heeft dit nummer te retourneren. Maar kan dit ook handiger door middel van een sql vraagstuk?
Tabel voorbeeld:
nieuwsbriefnummer - volgnummer
8840 - 1
8840 - 3
1234 - 1
1234 - 2
8840 - 5
1234 - 6
8840 - 7
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
if(isset($_GET['movedown']) AND is_numeric($_GET['movedown'])){
$movedown = $_GET['movedown'];
$dichtsbijzijnderij = 99999999999999;
$sql = "SELECT * FROM nieuwsbriefdataberichten WHERE nbid='".$_GET['id']."' AND volgordeid > '".$movedown."'";
$resultaat = mysql_query($sql, $conn) or die(mysql_error());
while($rij = mysql_fetch_assoc($resultaat)){
if($rij['volgordeid'] < $dichtsbijzijnderij){
$dichtsbijzijnderij = $rij['volgordeid'];
}
}
// Wissel de volgnummers om
if($dichtsbijzijnderij != 99999999999999){
$sql = "UPDATE nieuwsbriefdataberichten SET volgordeid='0' WHERE nbid='".$_GET['id']."' AND volgordeid='".$movedown."' ";
mysql_query($sql, $conn) or die(mysql_error());
$sql = "UPDATE nieuwsbriefdataberichten SET volgordeid='".$movedown."' WHERE nbid='".$_GET['id']."' AND volgordeid='".$dichtsbijzijnderij."' ";
mysql_query($sql, $conn) or die(mysql_error());
$sql = "UPDATE nieuwsbriefdataberichten SET volgordeid='".$dichtsbijzijnderij."' WHERE nbid='".$_GET['id']."' AND volgordeid='0' ";
mysql_query($sql, $conn) or die(mysql_error());
}
}
?>
if(isset($_GET['movedown']) AND is_numeric($_GET['movedown'])){
$movedown = $_GET['movedown'];
$dichtsbijzijnderij = 99999999999999;
$sql = "SELECT * FROM nieuwsbriefdataberichten WHERE nbid='".$_GET['id']."' AND volgordeid > '".$movedown."'";
$resultaat = mysql_query($sql, $conn) or die(mysql_error());
while($rij = mysql_fetch_assoc($resultaat)){
if($rij['volgordeid'] < $dichtsbijzijnderij){
$dichtsbijzijnderij = $rij['volgordeid'];
}
}
// Wissel de volgnummers om
if($dichtsbijzijnderij != 99999999999999){
$sql = "UPDATE nieuwsbriefdataberichten SET volgordeid='0' WHERE nbid='".$_GET['id']."' AND volgordeid='".$movedown."' ";
mysql_query($sql, $conn) or die(mysql_error());
$sql = "UPDATE nieuwsbriefdataberichten SET volgordeid='".$movedown."' WHERE nbid='".$_GET['id']."' AND volgordeid='".$dichtsbijzijnderij."' ";
mysql_query($sql, $conn) or die(mysql_error());
$sql = "UPDATE nieuwsbriefdataberichten SET volgordeid='".$dichtsbijzijnderij."' WHERE nbid='".$_GET['id']."' AND volgordeid='0' ";
mysql_query($sql, $conn) or die(mysql_error());
}
}
?>
Dat kan inderdaad ook, maar hierbij indexeer je, en dit kan lang duren als de database groter is. Vandaar dat ik zocht naar een sneller algoritme.
Voor zover ik weet is er geen andere oplossing. Met een index op de kolom volgnummer (die je sowieso waarschijnlijk al hebt) zal dit waarschijnlijk ook nog een van de snellere oplossingen zijn...
Weet niet precies hoe je het schrijft maar het zou daar op moeten lijken. misschien iemand anders of phpmanual.
@Gijs: dat is niet wat de TS wil. Hij is op zoek naar een manier om het eerstvolgende id op te halen als je een bepaald id weet. Dus niet het hoogste id...