sql: welke waarde is het kortste bij
Al sorry voor de slechte titel maar ik wist niets anders te verzinnen.
Mijn vraag gaat als volgt.
Ik heb in de database enkele rijen staan nu wil ik (adhv) een script kijken welke rij het korste bij is bij de waarde die ik heb ingevoerd.
Een voorbeeld
--database--
id - waarde
1 - 500 -
2 - 1000 -
stel ik typ in de form in 800 dan zou ik naar de rij met id 2 moeten gaan omdat dat het kortste bij ligt.
Mijn vraag is nu: Hoe selecteer ik de waarde die het kortste bij ligt?
Niels
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
<?php
$rij; //hier komt de juiste rij in te staan
$aantal = 800; //vull maar in
$query = "SELECT * FROM tabel WHERE waarde <=".$aantal." ORDER BY waarde DESC LIMIT 1";
$onder = mysql_fetch_array(mysql_query($query));
$query = "SELECT * FROM tabel WHERE waarde >=".$aantal." ORDER BY waarde LIMIT 1";
$boven = mysql_fetch_array(mysql_query($query));
if( ($boven-$aantal) >( $aantal-$onder) ){
$rij = $onder; //de rij onder $aantal ligt het dichtste bij
}else{
$rij = $boven; //de rij boven $aantal ligt het dichtste bij
}
//wat je er verder mee wilt doen
?>
$rij; //hier komt de juiste rij in te staan
$aantal = 800; //vull maar in
$query = "SELECT * FROM tabel WHERE waarde <=".$aantal." ORDER BY waarde DESC LIMIT 1";
$onder = mysql_fetch_array(mysql_query($query));
$query = "SELECT * FROM tabel WHERE waarde >=".$aantal." ORDER BY waarde LIMIT 1";
$boven = mysql_fetch_array(mysql_query($query));
if( ($boven-$aantal) >( $aantal-$onder) ){
$rij = $onder; //de rij onder $aantal ligt het dichtste bij
}else{
$rij = $boven; //de rij boven $aantal ligt het dichtste bij
}
//wat je er verder mee wilt doen
?>
Ik hoop dat dit duidelijk is en werkt zoals je bedoelt
Quote:
Edit typo's
Gewijzigd op 01/01/1970 01:00:00 door TJVB tvb
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
id,
waarde,
ABS(800-waarde) AS testvalue
FROM
tabel
ORDER BY
testvalue ASC
LIMIT 1
id,
waarde,
ABS(800-waarde) AS testvalue
FROM
tabel
ORDER BY
testvalue ASC
LIMIT 1
Wat deze query doet is het berekenen van de absolute waarde van het verschil tussen de waarde in de tabel en de waarde die de gebruiker invoert. Vervolgens oplopend sorteren op die waarde. Met de LIMIT zorg je dat er maar 1 waarde weergegeven wordt.
Enige nadeel van deze query is, dat als de gebruiker een waarde invoert die precies tussen twee andere waarden ligt, er maar 1 waarde weergegeven wordt. Dat zal dan de waarde met het laagste id zijn.
Het is gelukt.