met MySql een gat in een reeks vinden
Ik heb een tabel met daarin opeenvolgende oplopende cijfers: bv.
1 2 3 4 5 6. (en dan veel)
Er kan er een ontbreken. bv de 4.: 1 2 3 5 6. Dan wil ik de 4 opsporen. Hoe dat te doen?
Met een IF? Of toch CASE WHEN THEN? Ik ben slecht in loops in sql. Wie helpt me.
SELECT
FROM getallen
WHERE ;
b.v.d. Inigo
Dit gaat toch niet over de prinary key hoop ik.
Dan:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// welke getallen zijn er?
$getallen = array(1, 2, 3, 5, 6); // mist 4
// bereken/kijk welke tussen welke getallen er zijn
$start_getal = $getallen[0];
$eind_getal = end($getallen);
// maak een nieuwe array
$alle_getallen = range($start_getal, $eind_getal);
// bereken verschil
$verschil = array_diff($getallen, $alle_getallen);
// toon verschillen
echo '<pre>' . print_r($verschil, true) . '<pre>';
?>
// welke getallen zijn er?
$getallen = array(1, 2, 3, 5, 6); // mist 4
// bereken/kijk welke tussen welke getallen er zijn
$start_getal = $getallen[0];
$eind_getal = end($getallen);
// maak een nieuwe array
$alle_getallen = range($start_getal, $eind_getal);
// bereken verschil
$verschil = array_diff($getallen, $alle_getallen);
// toon verschillen
echo '<pre>' . print_r($verschil, true) . '<pre>';
?>
Ongetest, maar denk dat het wel werkt.
Edit:
Zie nu dat het in SQL moest... dan weet ik het ook niet. In PHP zou dit bovenstaande wel werken.
Zie nu dat het in SQL moest... dan weet ik het ook niet. In PHP zou dit bovenstaande wel werken.
Gewijzigd op 01/01/1970 01:00:00 door Eddy E
lijkt me niet nee, kan dat uberhaupt?
@Eddy:
als het met PHP moet weet ik wel een efficientere oplossing (de getallen komen uit de tabel nl):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$sql = "
SELECT getal AS nr
FROM tbl
ORDER BY getal
";
if (!($temp = mysql_query($sql))) exit(mysql_error());
$i = 1;
while($nr = mysql_fetch_array($temp)){
if ($nr['nr'] == $i){
$i +=1;
}
}
$ontbrekend_getal = $i;
?>
$sql = "
SELECT getal AS nr
FROM tbl
ORDER BY getal
";
if (!($temp = mysql_query($sql))) exit(mysql_error());
$i = 1;
while($nr = mysql_fetch_array($temp)){
if ($nr['nr'] == $i){
$i +=1;
}
}
$ontbrekend_getal = $i;
?>
Gewijzigd op 01/01/1970 01:00:00 door El Grimbo
Select `ID` From tmp_reeks WHERE `ID` < (SELECT Max(getal) FROM tbl)
AND NOT `ID` IN
(SELECT Getal From tbl)
Volgens mij moet die het doen....
maar wat ik me afvroeg:
kan je niet gewoon in 1 select statement door de bestaande kolom fietsen en zoeken naar een ontbrekende schakel in een reeks? Zoals in mijn bovenstaande PHP loop (die goed werkt overigens dus het probleem is eigenlijk opgelost ware het niet dat ik het in SQL wilde doen)
Dus zonder extra tabellen aan te gaan maken.
zonder extra tabellen is het volgens mij niet mogelijk, ik heb hier iets van 4 jaar geleden ook een hele tijd mee gespeeld en toen kwam ik uiteindelijk tot bovenstaande oplossing